Кажется, проблема в части "данные канала в файл журнала".
Давайте посмотрим: вы используете "&", чтобы поместить цикл в фоновом режиме, я думаю, вы имеете в виду, что он должен работатьпараллельно со вторым циклом.
Но проблема в том, что вам даже не нужен знак «&», потому что, как только больше нет данных в fifo, while..read останавливается.(Тем не менее, вы должны иметь некоторые сначала для первого чтения, чтобы работать).Следующее чтение не зависает, если больше нет данных (что может создать другую проблему: как ваша программа останавливается?).
Я полагаю, что при чтении проверяется, доступно ли больше данных в файле, прежде чем выполнять чтение, и останавливается, если это не так.
С этим примером можно проверить:
mkfifo foo
while read data; do echo $data; done < foo
Этот скрипт будет зависать, пока вы не напишите что-нибудь из другой оболочки (или bg первой).Но это заканчивается, как только чтение начинает работать.
Редактировать: я тестировал на RHEL 6.2 и работает, как вы говорите (например, плохо!).
Проблема в том, что послезапустив скрипт (скажем, скрипт «а»), у вас остался процесс «а».Так что да, сценарий каким-то образом зависает, как я писал ранее (не тот глупый ответ, как я думал тогда :)).За исключением случаев, когда вы пишете только один журнал (будь то только файл журнала или эхо, в этом случае это работает).
(Это цикл чтения из PIPE_ECHO, который зависает при записи в PIPE_LOG и оставляет процесс, выполняющийся каждый раз).
Я добавил несколько сообщений отладки, и вот что я вижу:
- только одна строка считывается из PIPE_LOG и после этого цикл заканчивается
- затем второе сообщение отправляется в PIPE_LOG (после того, как было получено из PIPE_ECHO), но процесс больше не читает из PIPE_LOG => запись зависает.
Когда вы ls -l / proc/ [pid] / fd, вы можете видеть, что fifo все еще открыт (но удален).На самом деле, скрипт завершает работу и удаляет fifo, но есть еще один процесс, использующий его.Если вы не удалите log fifo при очистке и не отследите его, это освободит процесс зависания.
Надеюсь, это поможет ...