Процесс неожиданно завершает работу при отправке в именованный канал

sed -e '
   # not interested in empty lines or blank lines
   /^$/b
   /\S/!b

   N;                        # get the next line into pattern space
   /^\(.*\)\n\1$/!{P;D;};    # compare 2 in the pattern space as string eq
   /\nnot a color$/b;        # 2 EQUAL, they are "not a color" => NOP
   s/$/ is a color/;         # 2 EQUAL, but not "not a color" => suffix
' your_colors.file
0
30.05.2019, 09:50
1 ответ

В каждой итерации вашего цикла readбудет открывать канал для чтения, читать строку данных, а затем закрывать его.

Если iotopрешит попытаться записать в канал, когда readне читает из него активно, он получит сигнал PIPE, так как пытается записать в канал, из которого никто не читает. По умолчанию при получении сигнала PIPEпроцесс завершается.

Вместо того, чтобы открывать и закрывать канал для чтения в цикле (и надеяться, что iotopне будет писать в канал, пока он не читается из ), перенаправить ввод из канала в цикл сама:

pipe=./diskfifo

while read word; do
    [ "$word" = 'quit' ] && break
    printf '%s\n' "$word"
done <"$pipe"

Это будет держать трубу открытой на протяжении всего цикла. Каждый вызов readбудет наследовать свой стандартный входной поток от стандартного ввода цикла, который подключен к каналу.


Возможная другая формулировка цикла:

while read word && [ "$word" != 'quit' ]; do
    printf '%s\n' "$word"
done <"$pipe"
3
28.01.2020, 02:22

Теги

Похожие вопросы