【问题标题】:tee /dev/null consuming input?tee /dev/null 消耗输入?
【发布时间】:2016-07-27 22:36:10
【问题描述】:

不知何故,运行./program | tee /dev/null 似乎正在消耗它的输出。当它自己运行时,程序会打印一些文本,然后继续运行,同时通过 UDP 套接字进行通信。它产生了很多我想以过滤方式查看的日志消息,所以我尝试运行./program | grep -v "I dont wan't to see logs like this!" | tail -f,但它没有产生任何输出。我放弃了一点,决定只将tee 输出到另一个文件,然后我可以用我的编辑器检查该文件,但结果是一个空文件。

有问题的程序是由学生编写的,因此问题可能出在其中。什么可能导致这种行为?我该如何纠正?

总结:

./program 打印 output./program | tee /dev/null 不打印任何内容。 ./program 的来源可能存在问题,但无论如何如何正确使用它?

【问题讨论】:

  • 也许程序检测到stdout是否被重定向?或者它可能试图改变标准输出句柄的文件描述符?你有这个程序的源代码吗?

标签: unix pipe stdout tee


【解决方案1】:

当有问题的程序检查它是否连接到终端并为终端与非终端执行不同的操作时,通常会发生这种情况。解决这个问题并捕获输出的最简单方法是使用脚本:

script -c "./program" /dev/stdout | grep -v "I dont wan't to see logs like this!" | tail -f

script 将在伪终端中运行程序(因此它会认为它已连接到终端)并将输出写入/dev/stdout,然后通过管道传输到grep

您可能还希望 script-f 参数使其在每次写入后刷新输出(否则在写入管道之前会被缓冲)。

【讨论】:

  • 谢谢,我试过了,但没用,但它帮助我找出了真正的问题。出于某种原因,源代码包含代码:if (!fork()) { ... },没有别的......所以它在一个叉子中运行,我认为这是导致问题的原因。无论如何,移除无意义的叉子修复了它。
  • 没关系,我认为它已经修复了它,但它只是在我 ^C'ed 程序后才转储输出。与您的script 解决方案类似的结果,它正确打印和开球,但不会实时更新。只有在没有任何管道的情况下调用程序时,才会发生实时更新。我什至在整个过程中都添加了 fflush(stdout) 来帮助... 无济于事。
  • 如果您希望它实时更新而不是在程序终止时更新,您需要使用-f 选项来编写我上面提到的脚本...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
相关资源
最近更新 更多