所有进程都有一个标准输出并且可以写入它。如果你想找到那些标准输出是当前终端的进程,在Linux上你可以使用
\nfind -L /proc/[0-9]*/fd/1 -prune -samefile /dev/stdout\n
Run Code Online (Sandbox Code Playgroud)\n类似的
\nfind -L /proc/[0-9]*/fd/2 -prune -samefile /dev/stdout\n
Run Code Online (Sandbox Code Playgroud)\n将识别其标准错误是当前终端的进程。您可以将两者结合起来
\nfind -L /proc/[0-9]*/fd/[12] -prune -samefile /dev/stdout\n
Run Code Online (Sandbox Code Playgroud)\n然而,这并不能告诉您它们是否实际写入当前终端。
\n要实际记录所有写入其标准输出的 PID,如果您的内核支持 eBPF(许多发行版内核现在都支持 eBPF;有关详细信息,请参阅内核要求),您可以使用bpftrace :bpftrace
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
程序写入标准输出,所以它最终只记录自身)。