在線搜索了一些內容,找到了簡單的'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