続行する前に、プロセスがファイルの読み取りを開始したことをどのように確認できますか?

続行する前に、プロセスがファイルの読み取りを開始したことをどのように確認できますか?

データがファイルに書き込まれるかどうかをテストするコマンドを作成しようとしています。私の最初のアプローチは次のとおりです。

  1. バックグラウンドで読み始めます。
  2. 一部のデータをファイルに書き込みます。
  3. 読者が理解するのを待ちます。
  4. 無限に繰り返し、タイミングの問題があるかどうかを確認します。

スクリプト形式:

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に基づいて)を実行しました。

おすすめ記事