为什么“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

我也尝试了--line-bufferedgrep 选项,但没有成功,并且删除 grep 并使用也| tail -f得到了相同的结果。

以下是整个输出:https://paste.debian.net/hidden/290d8573/

谢谢

答案1

唯一|的收获是标准输出(stdout)流;这些消息将发送到标准误差(stderr)流。使用grep隐藏 stderr 消息是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
    

相关内容