cheft Asked: 2018-05-26 12:08:53 +0800 CST2018-05-26 12:08:53 +0800 CST 2018-05-26 12:08:53 +0800 CST 我可以通过管道输出已启动进程的输出吗?[复制] 772 假设我已经开始program并且它继续将一些输出写入标准输出。有没有办法添加一个管道,例如,我可以计算它产生的行数wc -l? pipe background-process 2 个回答 Voted Best Answer user147505 2018-05-26T13:45:40+08:002018-05-26T13:45:40+08:00 您可以在 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。 我使用了这两个答案: https://stackoverflow.com/a/1323999/6631810 https://stackoverflow.com/a/3834605/6631810 m0dular 2018-05-26T12:18:43+08:002018-05-26T12:18:43+08:00 您可以tee在启动程序时使用。如果你使用 bash,你可以这样做: program > >(tee -a log.txt) 这会将标准输出重定向program到正在运行的进程替换tee。program这实质上是写入to的 stdout 的副本log.txt。 tee将继续将标准输出发送到之前的任何地方,可能是终端,具体取决于program工作方式。
您可以在 Linux 中执行此操作。假设有一个脚本
s
:运行:
就这样……现在你需要
gdb
附加到这个过程中。现在你在
gdb
。在这里执行此操作:这已经关闭了 STDOUT 文件描述符。现在打开一个新的:
在另一个终端中,您已经可以设置阅读过程:
什么都没有,因为您需要从
gdb
另一个终端中分离出来。要么Ctl+ D,要么:用
y
和确认Enter。现在你应该看到(tail
运行的地方)是这样的:如果您更喜欢使用已经存在的文件或管道,请在以下位置执行此操作
gdb
:这说明了重定向 STDOUT。它与 STDERR 类似,只是它的编号为 2。
我使用了这两个答案:
您可以
tee
在启动程序时使用。如果你使用 bash,你可以这样做:这会将标准输出重定向
program
到正在运行的进程替换tee
。program
这实质上是写入to的 stdout 的副本log.txt
。tee
将继续将标准输出发送到之前的任何地方,可能是终端,具体取决于program
工作方式。