如何找出正在写入 STDOUT 的进程?

TCZ*_*CZ8 21 process debugging open-files trace stdout

我有两个正在运行的进程实例。其中之一是“吓坏了!” 和打印错误不停地到标准输出。

我想终止损坏的进程,但我必须确保我不会终止错误的进程。它们几乎是同时启动的,使用top我可以看到它们使用的内存和 CPU 量大致相同。我似乎找不到任何表明哪个进程表现不佳的内容。

最安全的做法是找出哪个进程/pid 正在写入 STDOUT。

有没有办法做到这一点?

jof*_*fel 25

您可以通过向它们发送 SIGSTOP 来停止这两个处理(用实际的PID或使用killall和应用程序名称替换 pid1 和 pid2 ):

kill -SIGSTOP pid1 pid2
Run Code Online (Sandbox Code Playgroud)

终端(或重定向到 stdout 的任何地方)上的打印应该停止。然后继续使用其中之一

kill -SIGCONT pid1
Run Code Online (Sandbox Code Playgroud)

如果错误消息立即出现,您就知道这是第一个过程。如果没有,您可以再次停止并继续第二个......

在杀死停止的进程之前,最好先发送 SIGCONT。

相同的技术可以与Ctrl-Zshell 作业控件(fg %1bg %1kill %1、 ...)一起使用。


Sté*_*las 20

在 Linux 上,假设您想知道向与 shell 的 stdout 连接的同一资源写入的内容,您可以执行以下操作:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')
Run Code Online (Sandbox Code Playgroud)

这将报告write()每个进程的系统调用(在任何文件描述符上),这些进程在与 shell 的 fd 1 相同的文件上打开了至少一个文件描述符。