データがファイルに書き込まれるかどうかをテストするコマンドを作成しようとしています。私の最初のアプローチは次のとおりです。
- バックグラウンドで読み始めます。
- 一部のデータをファイルに書き込みます。
- 読者が理解するのを待ちます。
- 無限に繰り返し、タイミングの問題があるかどうかを確認します。
スクリプト形式:
while true
do
grep -q foo <(tail -n0 -f /var/log/syslog) &
logger foo && logger line && wait
done
(このコマンドはファイルに行が表示されるのをlogger line
防ぐためのものです)last message repeated N times
このバージョンは通常、wait
コマンドの実行が中断される前に1〜2回繰り返されるため、tail
ファイルに書き込む前に読み取りを開始する時間がないようです。logger foo
最良の方法は何ですか保証するつまり、tail
続行する前にお読みください?次の回避策は理想的ではありません。
以前の一時停止
logger
(遅いファイルシステムでは機能しません)sleep 1 && logger foo && logger line && wait
2番目のリーダーが起動し、2番目のリーダーが表示されるまで、1番目のリーダーが読み取りを開始したとします。詰まる前に何千回も繰り返しました。
grep -q foo <(tail -n0 -f /var/log/syslog) & grep -q bar <(tail -n0 -f /var/log/syslog) & while kill -0 $! do logger bar logger line done logger foo && logger line && wait
ベストアンサー1
読者が実際に読んでいることを確認してから再利用する方法は次のとおりです。
while true
do
exec 3<> myfifo
tail -n0 -f /var/log/syslog >&3 &
tailproc=$!
while ! grep -q start <&3
do
logger start
logger line
done
grep -q end <&3 &
logger end
logger line
wait $!
exec 3<&-
exec 3>&-
kill $tailproc
done
~から作成者がブロックされ、誰も読むことができません。(最初のgrep
コマンドと2番目のコマンドの間)2番目のコマンドはgrep
次の行を見逃すことはできません。
中断せずに数万回の繰り返し(出力のプロセスIDに基づいて)を実行しました。