いくつかの作業を並行して実行したいbashスクリプトがあります。バックグラウンドで実行されるサブシェルに各ジョブを配置することでこれを行いました。同時に実行されるジョブの数はある程度制限されているはずですが、最初にいくつかの行を FIFO に入れ、次にサブシェルをフォークする直前に、親スクリプトがこの FIFO から行を読み取る必要があります。サブシェルをフォークできるのは、行を取得した後でのみです。これまでのところ、すべて正常に動作しています。しかし、サブシェルで FIFO から行を読み込もうとすると、FIFO にもっと多くの行があるように見えても、行を取得できるのは 1 つのサブシェルだけのようです。FIFOにさらに行がある場合でも、他のサブシェルが行を読み取れないのはなぜでしょうか。
私のテストコードは次のようになります。
#!/bin/sh
fifo_path="/tmp/fy_u_test2.fifo"
mkfifo $fifo_path
#open fifo for r/w at fd 6
exec 6<> $fifo_path
process_num=5
#put $process_num lines in the FIFO
for ((i=0; i<${process_num}; i++)); do
echo "$i"
done >&6
delay_some(){
local index="$1"
echo "This is what u can see. $index \n"
sleep 20;
}
#In each iteration, try to read 2 lines from FIFO, one from this shell,
#the other from the subshell
for i in 1 2
do
date >>/tmp/fy_date
#If a line can be read from FIFO, run a subshell in bk, otherwise, block.
read -u6
echo " $$ Read --- $REPLY --- from 6 \n" >> /tmp/fy_date
{
delay_some $i
#Try to read a line from FIFO, __ only one subshell succeeds the following line. __
read -u6
echo " $$ This is in child # $i, read --- $REPLY --- from 6 \n" >> /tmp/fy_date
} &
done
出力ファイル /tmp/fy_date の内容は次のとおりです。
Mon Apr 26 16:02:18 CST 2010
32561 Read --- 0 --- from 6 \n
Mon Apr 26 16:02:18 CST 2010
32561 Read --- 1 --- from 6 \n
32561 This is in child # 1, read --- 2 --- from 6 \n
そこでは、次のような行が期待されます。
32561 This is in child # 2, read --- 3 --- from 6 \n
しかし、それは表示されず、発行するまで子 #2 プロセスがそこでブロックされます:
echo something > /tmp/fy_u_test2.fifo