awk
tail -f
inotifywait -m
対。の出力を分析するときの動作が異なります。特に、一致する文字列を検索していますが、その文字列が表示されたらawk
終了したいと思います。これはうまく機能しますが、そのtail -f
場合はinofitywait
2awk
回トリガーする必要があります。なぜこれですか?
再現可能な例:
どちらの場合も、特定の文字列(「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 -A
inotifywait
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 …
後もまだ実行中です。もっと書こうとする時だけ手に入るこのポイントに戻ってトリガーしてみてください。awk
inotifywait
SIGPIPE
touch test.file
echo
一方、退場後すぐに終了するtail
のはtail -f … | awk …
awk
GNU は、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 $?