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 %1、bg %1、kill %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 相同的文件上打开了至少一个文件描述符。