我有兩個進程和一個命名管道。
一個進程主動從管道中讀取數據,另一個進程不斷向管道發送數據。
發送到管道的命令如下:
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"