如何获取将输出记录到标准输出的“进程 ID”?

Alw*_*ner 3 process stdout

如何获取将输出转储到 stdout 的所有进程的 PID。

Ste*_*itt 9

所有进程都有一个标准输出并且可以写入它。如果你想找到那些标准输出是当前终端的进程,在Linux上你可以使用

\n
find -L /proc/[0-9]*/fd/1 -prune -samefile /dev/stdout\n
Run Code Online (Sandbox Code Playgroud)\n

类似的

\n
find -L /proc/[0-9]*/fd/2 -prune -samefile /dev/stdout\n
Run Code Online (Sandbox Code Playgroud)\n

将识别其标准错误是当前终端的进程。您可以将两者结合起来

\n
find -L /proc/[0-9]*/fd/[12] -prune -samefile /dev/stdout\n
Run Code Online (Sandbox Code Playgroud)\n

然而,这并不能告诉您它们是否实际写入当前终端。

\n

要实际记录所有写入其标准输出的 PID,如果您的内核支持 eBPF(许多发行版内核现在都支持 eBPF;有关详细信息,请参阅内核要求),可以使用bpftrace :bpftrace

\n
sudo bpftrace -e \'kprobe:ksys_write /comm != "bpftrace" && arg0 == 1/ { printf("PID %d writing to stdout\\n", pid); }\'\n
Run Code Online (Sandbox Code Playgroud)\n

这会将每次写入记录到标准输出(文件描述符 1),除了来自bpftrace自身的写入(因为该bpftrace程序写入标准输出,所以它最终只记录自身)。

\n