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
誰も読まないパイプに書き込もうとするので信号を受け取ります。信号を受信するときのデフォルトの動作はプロセスを終了することです。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"