StackOverflow post から 'grep -q' が 'tail -f' で終了しない:
<ブロック引用>
tail -f
ファイルを読み取り、後で追加された行を表示しますが、終了しません (SIGTERM
のようなシグナルがない限り) 送信されます)。 grep
tail -f
はブロック部分ではありません は。 grep
パイプが閉じられるまでパイプから読み取りますが、tail -f
のため、決してそうではありません 終了せず、パイプを開いたままにします。
問題の解決策はおそらく (テストされておらず、パフォーマンスが悪い可能性が非常に高い):
tail -f logfile | while read line; do
echo $line | grep -q 'find me to quit' && break;
done
リンクされた投稿で、より多くの情報と解決策を見つけることができます。
grep
tail
でも終了し、パイプは消えます 走り続けます。このバグ レポート ログは、あなたのケースと非常によく似たユース ケースから始まります:
tail
を使いたい と grep
特定のパターンが現れるまでファイルを追跡します。しかし tail
grep
の場合は終了しません
$ echo xxx > /tmp/blabla
$ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx"
xxx
現在 tail
/tmp/blabla
に再度書き込む場合にのみ、読み取りを試みて終了します .
これが本来あるべき姿ですか?
そこの説明:
<ブロック引用>
tail
は SIGPIPE で終了しますが、write()
でのみシグナルを取得します 、したがって、tail
より前にファイル内のデータをさらに取得する必要があります 終了します。
私の知る限り、この正確なメカニズムは非常に一般的です。多くのツールは後に終了します 彼らは壊れたパイプに何かを書き込もうとしますが、それはバグではありません。
そして、こんな願いが叶いました:
<ブロック引用>
tail
であることは妥当なポイントです。 、それは永遠にぶらぶらすることができるので、パイプのもう一方の端が離れていくのに対応するために特別な手順を踏む必要があります.
最後に:
<ブロック引用>
実装:
https://git.sv.gnu.org/cgit/coreutils.git/commit/?id=v8.27-42-gce0415f
実際、tail
で問題を再現しようとすると、 GNU coreutils 8.28 からはできません。ツールはすぐに終了します。