在线搜索了一些内容,找到了简单的'tutorials'来使用命名管道。但是,当我做任何背景工作时,我似乎失去了大量的数据。在bash中使用命名管道 - 数据丢失问题
[[编辑:找到一个更简单的解决方案,请参阅回复帖子。所以我提出的问题现在是学术 - 如果有人可能需要一个工作服务器]]
使用Ubuntu 10.04与Linux 2.6.32-25-generic#45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64的GNU/Linux的
GNU的bash,版本4.1.5(1)-release下(x86_64-PC-Linux的GNU)。
我的bash的功能是:
function jqs
{
pipe=/tmp/__job_control_manager__
trap "rm -f $pipe; exit" EXIT SIGKILL
if [[ ! -p "$pipe" ]]; then
mkfifo "$pipe"
fi
while true
do
if read txt <"$pipe"
then
echo "$(date +'%Y'): new text is [[$txt]]"
if [[ "$txt" == 'quit' ]]
then
break
fi
fi
done
}
我在后台运行,这样的:
> jqs&
[1] 5336
现在我喂它:
for i in 1 2 3 4 5 6 7 8
do
(echo aaa$i > /tmp/__job_control_manager__ && echo success$i &)
done
输出是不一致的。 我经常没有得到所有成功的回声。 我最多可以获得与成功回声一样多的新文本回声,有时甚至更少。
如果我从“饲料”去除“&”,似乎工作,但我阻止,直到输出被读取。因此,我想让子流程被阻止,但不是主流程。
其目的是写一个简单的作业控制脚本,这样我可以运行在说最并联10个就业机会,并排队等待稍后处理的休息,但可靠地知道,他们运行。
全部工作如下经理:
function jq_manage
{
export __gn__="$1"
pipe=/tmp/__job_control_manager_"$__gn__"__
trap "rm -f $pipe" EXIT
trap "break" SIGKILL
if [[ ! -p "$pipe" ]]; then
mkfifo "$pipe"
fi
while true
do
date
jobs
if (($(jobs | egrep "Running.*echo '%#_Group_#%_$__gn__'" | wc -l) < $__jN__))
then
echo "Waiting for new job"
if read new_job <"$pipe"
then
echo "new job is [[$new_job]]"
if [[ "$new_job" == 'quit' ]]
then
break
fi
echo "In group $__gn__, starting job $new_job"
eval "(echo '%#_Group_#%_$__gn__' > /dev/null; $new_job) &"
fi
else
sleep 3
fi
done
}
function jq
{
# __gn__ = first parameter to this function, the job group name (the pool within which to allocate __jN__ jobs)
# __jN__ = second parameter to this function, the maximum of job numbers to run concurrently
export __gn__="$1"
shift
export __jN__="$1"
shift
export __jq__=$(jobs | egrep "Running.*echo '%#_GroupQueue_#%_$__gn__'" | wc -l)
if (($__jq__ '<' 1))
then
eval "(echo '%#_GroupQueue_#%_$__gn__' > /dev/null; jq_manage $__gn__) &"
fi
pipe=/tmp/__job_control_manager_"$__gn__"__
echo [email protected] >$pipe
}
调用
jq <name> <max processes> <command>
jq abc 2 sleep 20
将启动一个进程。 这部分工作正常。开始第二个,很好。手工一个接一个似乎很好。 但是,在循环中启动10似乎会丢失系统,如上面更简单的示例。
任何提示,以我能做些什么来解决IPC数据的这种明显的损失,将不胜感激。
问候, 阿兰。
查看[second 2018编辑为*如何设置一个变量来自命令输出*](https://stackoverflow.com/a/41236640/1765658)或[GitHub.com:Connector-的bash](https://github.com/F-Hauri/Connector-bash)。我*连接* subprocess hoding *工具*到我目前的shell会话。 – 2018-02-12 15:59:24