假设我已经开始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
。这实际上写入了program
to的标准输出的副本log.txt
。 tee
将继续将标准输出发送到之前要去的任何地方,可能是终端,具体取决于工作原理program
。