У меня есть скрипт bash, который хочет выполнить некоторую работу параллельно, я сделал это, поставив каждое задание в подоболочку, которая запускается в фоновом режиме. В то время как количество заданий, выполняемых одновременно, должно быть ограничено, я достигаю этого, сначала поместив некоторые строки в FIFO, а затем перед тем, как развернуть подоболочку, родительский скрипт должен прочитать строку из этого FIFO. Только после того, как он получит строку, она может разблокировать подоболочку. До сих пор все работает нормально. Но когда я попытался прочитать строку из FIFO в подоболочке, кажется, что только одна подоболочка может получить строку, даже если в FIFO есть больше строк. Поэтому я удивляюсь, почему другие подоболочки (s) не могут читать строку, даже если в FIFO больше строк.
Мой код тестирования выглядит примерно так:
Данные в linux 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 дочерний процесс # блокируется там, пока я не выдать:
эхо что-то> /tmp/fy_u_test2.fifo
Спасибо, но это не имеет значения. Кстати, мой bash имеет следующую информацию о версии: GNU bash, версия 3.00.15 (1) -release (x86_64-redhat-linux-gnu) Copyright (C) 2004 Free Software Foundation, Inc. – Utoah
@Utoah: Я пробовал его в 3.2 и 4.0, и он работал в обоих. –