GNU/Linux >> Linux の 問題 >  >> Linux

なぜ `tail -f … | grep -q …` 一致が見つかったら終了しますか?

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 からはできません。ツールはすぐに終了します。


Linux
  1. 複数のパターンでGrepを実行する方法は?

  2. 〜/ .profileを〜/.bash_profileに追加する理由

  3. Grep-o-wでMacOsXで期待される出力が得られないのはなぜですか?

  1. 引用符を使用すると、なぜ単一の円記号が表示されるのですか?

  2. Grep -e、Sed -e –「[x] {1,9999}」を使用するとパフォーマンスが低下しますが、なぜですか?

  3. grep は指定された範囲内の行のみに一致します

  1. Sed、Awk、またはGrepを使用したマルチラインパターンマッチ?

  2. 一致を見つけた後、Grepの終了が遅いですか?

  3. UASP が使用されない理由