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


19

我有两个正在运行的流程实例。其中之一就是“可惜!” 和打印错误不会停止到STDOUT。

我想杀死破裂的过程,但是我必须确保不要终止错误的过程。它们都是在大约同一时间启动的,使用top它们,我可以看到它们都使用了大约相同数量的内存和CPU。我似乎找不到任何指向哪个进程表现不佳的信息。

最安全的事情是弄清楚哪个进程/ pid正在写入STDOUT。

有什么办法吗?


1
写入stdout意味着写入其文件描述符1((正在讨论的进程的)文件描述符1,该文件描述符可以是终端或/dev/null。您确定不是特定文件(例如终端设备或日志文件...)吗?
斯特凡Chazelas

如果它们都在同一外壳中启动,那么它们都将写入STDOUT,因此固定此位置将无助于您确定要杀死2个中的哪个。Jofel的方法可能就是您要寻找的方法。
slm

他真正的意思是说哪个人正在终端上产生输出
Barmar 2014年

Answers:


17

在Linux上,假设您想知道正在写入与Shell的stdout连接到的相同资源的内容,则可以执行以下操作:

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

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


这就是我最初的想法,感谢你们俩,我将尝试两种方法。
TCZ8

23

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

kill -SIGSTOP pid1 pid2

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

kill -SIGCONT pid1

如果错误消息立即出现,则说明其第一步。如果没有,您可以再次停止它,然后继续第二次...

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

同样的技术可以被用来Ctrl-Z和外壳作业控制(fg %1bg %1kill %1,...)。


1
那是解决它的一个很好的方法,但是我真的在寻找一种方法来跟踪谁在写终端。谢谢
TCZ8

我只是在重读这个问题,似乎在写我的最后评论时脑子里放屁。这也可以解决我的问题。谢谢。
TCZ8 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.