名前付きパイプに送信中にプロセスが予期せず終了しました。

名前付きパイプに送信中にプロセスが予期せず終了しました。

2つのプロセスと名前付きパイプがあります。

あるプロセスはパイプからデータを積極的に読み込み、もう一方のプロセスはパイプにデータを継続的に送信します。

パイプに送信されるコマンドは次のとおりです。

sudo iotop -b -P > diskfifo

一方、リーダーはパイプでループ読み取り操作を実行します。

pipe=./diskfifo

while read line <$pipe
do
    if [[ "$line" == 'quit' ]]; then
        break
    fi
    echo $line
done

問題:iotopコマンドが特定の回数の繰り返し後に停止することがありますが、その理由を理解できません。

ところで、送信されるデータ量を減らしても、iotopコマンドが停止しないことを確認しました。

答え1

ループが繰り返されるたびに、パイプは読み取り用にread開き、データ行を読み取って閉じます。

パイプから積極的に読み取らずにパイプに書き込もうと決めると、iotop誰も読まないパイプに書き込もうとするので信号を受け取ります。信号を受信するときのデフォルトの動作はプロセスを終了することです。readPIPEPIPE

ループから読み取るためにパイプを開閉する代わりに(そして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"

関連情報