有没有办法使用 strace 来显示进程的标准输出?我知道我能做到
strace -p pid -e write
但这显示了对多个文件描述符的 write(2) 调用。在阅读手册页时,我也看到了该-e write=
选项,但在使用时我得到了很多其他东西
strace -p pid -e write=1
基本上,我想要第一个命令 ( ) 的输出strace -p pid -e write
,但只显示write(1,...
输出。我知道我可以过滤输出,但我想知道 strace 是否有办法直接执行此操作。
答案1
如果您知道 PID,则可以将-P
参数挂接到 /proc 中的 STDOUT 文件描述符。像这样:
strace -p PID -P /proc/PID/fd/1 -e write
您可以在/proc/PID/fd 中找到进程的所有打开的文件描述符。 1 是 STDOUT 文件的符号链接。
答案2
当您知道文件描述符路径时,可以strace
使用参数过滤输出。-P
按照文档:
-y 打印与文件描述符参数关联的路径。
-P path 仅跟踪访问路径的系统调用。多个 -P 选项可用于指定多个路径。
-y
使用时不必使用-P
。您可以用来-y
初步找出文件描述符的路径。这可能是这样的/dev/pts/0
。
下面是一个示例,可用于显示使用以下disown
命令与 bash 断开连接的进程的输出:
strace -e trace=write -s 1000 -p12345 -P "/dev/pts/0 (deleted)" 2>&1 | awk -F "\"" '{print $2}'
在此示例中,是在会话中启动并最初写入 的12345
进程的 PID 。我们断开了该进程的使用并关闭了 bash。使用上面的命令,我们可以在不同的 bash 会话中显示该进程的输出。bash
stdout
bash
disown 12345
答案3
不。但也许strace
您可以简单地监视 pid 的标准输出tail -f /proc/<pid>/fd/1
来实现您的目标,而不是使用它。
例子:
$ for F in $(seq 1 100);do echo $F;sleep 1;done >/tmp/foo 2>&1 &
[1] 163
$ tail -f /proc/163/fd/1
4
5
6
7
8
9
^C
$
答案4
我写了一个工具,卡特彼勒,执行此任务。所以你可以catp $PID
。
基本上,它与在幕后strace
使用的相同。ptrace
它不是打印各种跟踪信息,而是将被跟踪者的输出打印到标准输出。