Process

如何找出正在寫入 STDOUT 的程序?

  • August 26, 2014

我有兩個正在執行的程序實例。其中之一是“嚇壞了!” 並且列印錯誤不停地輸出到 STDOUT。

我想殺死損壞的程序,但我必須確保我不會終止錯誤的程序。它們都是同時啟動的,使用top我可以看到它們都使用了大約相同數量的記憶體和 CPU。我似乎找不到任何表明哪個程序表現不佳的東西。

最安全的做法是找出哪個程序/pid 正在寫入 STDOUT。

有沒有辦法做到這一點?

在 Linux 上,假設您想知道與您的 shell 的 stdout 連接的同一資源正在寫入什麼,您可以這樣做:

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

這將報告在write()與 shell 的 fd 1 相同的文件上至少打開一個文件描述符的每個程序的系統呼叫(在任何文件描述符上)。

您可以通過向它們發送 SIGSTOP 來停止這兩個處理(將 pid1 和 pid2 替換為實際的PID或使用killall和應用程序名稱):

kill -SIGSTOP pid1 pid2

終端(或標準輸出重定向到的任何地方)上的列印應該停止。然後繼續其中一個使用

kill -SIGCONT pid1

如果錯誤消息立即出現,您就知道它是第一個過程。如果不是,您可以再次停止它並繼續第二個…

在終止已停止的程序之前,最好先發送 SIGCONT。

相同的技術可以與Ctrl-Zshell 作業控制項 ( fg %1, bg %1, kill %1, …) 一起使用。

引用自:https://unix.stackexchange.com/questions/140373