awkの尾はinotifywaitとは異なる動作をします。

awkの尾はinotifywaitとは異なる動作をします。

awktail -finotifywait -m対。の出力を分析するときの動作が異なります。特に、一致する文字列を検索していますが、その文字列が表示されたらawk終了したいと思います。これはうまく機能しますが、そのtail -f場合はinofitywait2awk回トリガーする必要があります。なぜこれですか?


再現可能な例:

どちらの場合も、特定の文字列(「OPEN」)を検索し、それを特別な終了コードとしてマークしたとします。inotofywaitしばらく待ってから(時間がかかります)、トリガーして終了コードを返します。擬似コード:

 command | awk-analysis || get-non-0-exit-code & trigger

すべてがそれより優れていますtail -f

以下は、a)行を印刷し、b)終了コードを返し、c)終了します。予想通り。

tail -f test.file | awk '/OPEN/ { print $0 ; exit 100 }' || echo $? &
  { sleep 2 ; echo OPEN > test.file ; }

しかしinotifywait -m

結果は完全に異なっていた。

inotifywait -m -e OPEN | awk '/OPEN/ { print $0 ; exit 100 }' || echo $? &
  { sleep 2 ; touch test.file ; }

これにより行が印刷されますが(inotifywaitトリガーされてawk表示されます)、終了コードは表示または終了しません。このような別のトリガーだけがtouch test.fileそれを停止できます。awk

たぶん制御文字ですか?

ここでシグナルの目的が欠落している可能性があると考え、分析のために(親フォルダの結果ファイル、それ以外の場合は2番目の「OPEN」がトリガーされます)をawk使用してみました。cat -Ainotifywait

tail -f test.file | tee >(cat -A >../stream) | ....
cat ../stream
OPEN$

そして

inotifywait -m -e OPEN | tee >(cat -A >../stream) | ....
cat ../stream
./ OPEN test.file$

したがって、目に見えない制御文字がありません。

この行動の理由は何ですか?

改行を逃しましたか?awkこの行は印刷されますが、exit同じコードブロックでコマンドを実行しないのはなぜですか?しかし、なぜ動作しますかtail


バージョン

awk --verison:GNU Awk 4.2.1、API:2.0(GNU MPFR 4.0.2、GNU MP 6.1.2)

inotifywait -h: inotifywait 3.14

tail --verison:tail(GNU coreutils) 8.30


Kusalanandaのコメントに基づいて編集:

テール-f

test.file存在し、次の内容があります。

*ケース1

OPEN
spam

*ケース2

spam
OPEN

*ケース3(ファイルが空です)

上記のトリガーが実行されていません。

tail -f test.file | awk '/OPEN/ {print $0 ; exit 100 }' || echo $?

ケース 1 & 2: 一致する行、終了コードをすぐに返し、終了します。

ケース3:待って別の端末を開き、echo OPEN >> 3/またはecho OPEN > 3文字列を返し、終了コードを終了します。

ベストアンサー1

echo $?パイプライン全体(前のコード||)が終了した後に実行されます。

終了inotifywait … | awk … || echo …後もまだ実行中です。もっと書こうとする時だけ手に入るこのポイントに戻ってトリガーしてみてください。awkinotifywaitSIGPIPEtouch test.fileecho

一方、退場後すぐに終了するtailのはtail -f … | awk …awkGNU は、tailこのような状況を検出するために特別な措置を講じています。


inotifywaitを使用してこれを再現するには、PIDを渡してawkを介してSIGPIPEを送信する必要があります。

{ inotifywait  -m -e OPEN ./  & echo $! ; } |
awk 'NR==1 {pid=$0}
     /OPEN/ {print $0,pid
             system("echo kill -13 "pid)
             exit 122  }' ||
echo $? 

おすすめ記事