「grep -v」または「tail -f」がプログラムの出力を停止するのはなぜですか?

「grep -v」または「tail -f」がプログラムの出力を停止するのはなぜですか?

次のコマンドで呼び出される Euro Truck Simulator 2 用のサーバーがあります。

LD_LIBRARY_PATH='$ORIGIN/../../linux64' eurotrucks2_server

サーバーの実行中に、コンソールに次の行が表示されることがあります (これを非表示にしたいです):

src/steamnetworkingsockets/clientlib/steamnetworkingsockets_sdr_common.h (564) : m_pServer->m_nReplyTimeoutsSinceLastRecv == 0

| grep -v "Timeout"しかし、または を追加するたびに| grep -v "steamnetworkingsockets"、サーバーの出力は次の行で切り捨てられます。

Setting breakpad minidump AppID = 227300

grep のオプションも試しましたが--line-bufferedうまくいきませんでした。grep を削除して使用しても| tail -f同じ結果になりました。

出力全体は次のとおりです。https://paste.debian.net/hidden/290d8573/

ありがとう

答え1

唯一|のキャッチ標準出力(stdout)ストリームに送られるメッセージは標準誤差(stderr)ストリーム。stderrgrepメッセージを非表示にするには、XY問題

Y問題の解決

grep両方を同時に行うには、stderrストリームをstdoutに転送する必要があります2>&1。例:

eurotrucks2_server 2>&1 | grep -v "Timeout"

X問題の解決策

  • stderr出力を破棄します2>/dev/null。例:

    eurotrucks2_server 2>/dev/null
    
  • stderr出力をログファイルに転送(追加)します2>>/path/to/error.log。例:

    eurotrucks2_server 2>>/var/log/eurotrucks2_server_error.log
    

関連情報