strace 对 stdout 的写入调用

strace 对 stdout 的写入调用

有没有办法使用 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 会话中显示该进程的输出。bashstdoutbashdisown 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它不是打印各种跟踪信息,而是将被跟踪者的输出打印到标准输出。

相关内容