我可以通过管道输出已启动的进程吗?

我可以通过管道输出已启动的进程吗?

假设我已经开始program,它继续将一些输出写入标准输出。有没有什么方法可以添加管道,以便我可以计算它生成的行数wc -l

答案1

您可以在 Linux 中执行此操作。假设有一个脚本s

#!/bin/bash
i=0
echo my pid: "$$"
while true; do
    echo "$i"; ((i++)); sleep 1; 
done

运行:

$ ./s
my pid: 8815
0
1
2

就这样......现在您需要gdb附加到该流程。

gdb -p 8815

现在你在gdb.在这里执行此操作:

p close(1)

这已关闭 STDOUT 文件描述符。现在打开一个新的:

p creat("/tmp/8815.out", 0600)

在另一个终端中您已经可以设置读取过程:

tail -f /tmp/8815.out

还没有任何进展,因为您需要从gdb另一个终端中分离。要么Ctl+ D,要么:

q
Quit anyway? (y or n) 

y用和确认Enter。现在你应该看到(tail运行的地方)如下所示:

173
174
175

如果您更喜欢使用现有的文件或管道,请在以下位置执行此操作gdb

p open("/path/to/your/output", 1)

这说明了重定向 STDOUT。它与 STDERR 类似,只是它的数字为 2。


我用了这两个答案:

答案2

tee启动程序时即可使用。如果您使用 bash,您可以执行以下操作:

program > >(tee -a log.txt)

这会将 的 stdout 重定向program到正在运行的进程替换tee。这实际上写入了programto的标准输出的副本log.txttee将继续将标准输出发送到之前要去的任何地方,可能是终端,具体取决于工作原理program

相关内容