一个进程如何在Linux上拦截另一个进程的stdout和stderr?

问题描述 投票:42回答:8

我有一些脚本应该已经停止运行,但是永远挂在后面。有什么办法可以使我以一种可读的方式弄清楚它们正在向STDOUT和STDERR写入什么?

例如,我尝试这样做:

$ tail -f /proc/(pid)/fd/1

但是那实际上不起作用。无论如何,这是一个远景。

还有其他想法吗?

strace本身很冗长,因此看不清。

注意:我only对它们的输出感兴趣,而不对其他任何东西感兴趣。我有能力自己弄清其他事情;此问题仅关注于访问正在运行的进程after启动它的stdout和stderr。

我有一些脚本应该已经停止运行,但是永远挂在后面。我是否可以通过某种方式以一种可读的方式弄清楚它们正在向STDOUT和STDERR写入什么内容?例如,我尝试过...

linux stdout
8个回答
7
投票

我不确定它是否对您有用,但是我读了一段时间描述method that uses gdb的页面


42
投票

由于不允许我编辑Jauco的答案,所以我将给出对我有用的完整答案(Russell的页面依赖于无保证的行为,如果您关闭STDOUT的文件描述符1,则下一个creat调用将打开FD 1。


10
投票

[有几个新的实用程序包装了“ gdb方法”,并增加了一些额外的功能。我现在使用的那个叫做“ reptyr”(“ Re-PTY-er”)。除了获取STDERR / STDOUT之外,它实际上还会更改进程的控制终端(即使先前未连接到终端)。


8
投票

GDB方法似乎更好,但是您也可以使用strace


5
投票

我使用了strace并解码了十六进制输出以清除文本:


4
投票

strace仅使用-ewrite(而不是=1后缀)输出少得多。它比IMO的GDB方法要简单一些。


3
投票

您可以使用重定向(https://github.com/jerome-pouiller/reredirect/)。


1
投票

您没有声明您的操作系统,但是我要刺一口说“ Linux”。

© www.soinside.com 2019 - 2024. All rights reserved.