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

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

我有两个正在运行的进程实例。其中之一是“吓坏了!”并不间断地将错误打印到 STDOUT。

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

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

有什么办法可以做到这一点吗?

答案1

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

kill -SIGSTOP pid1 pid2

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

kill -SIGCONT pid1

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

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

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

答案2

在 Linux 上,假设您想知道什么正在写入 shell 的 stdout 连接到的同一资源,您可以这样做:

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

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

相关内容