Process
如何找出正在寫入 STDOUT 的程序?
我有兩個正在執行的程序實例。其中之一是“嚇壞了!” 並且列印錯誤不停地輸出到 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-Z
shell 作業控制項 (fg %1
,bg %1
,kill %1
, …) 一起使用。