web-dev-qa-db-ja.com

STDOUTに書き込んでいるプロセスを見つける方法は?

プロセスの2つのインスタンスが実行されています。その1つが「frEAkIng oUT!」です。印刷エラーはノンストップでSTDOUTに送信されます。

壊れたプロセスを強制終了したいのですが、間違ったプロセスを終了しないようにする必要があります。どちらもほぼ同時に開始され、topを使用しています。どちらもほぼ同じ量のメモリとCPUを使用していることがわかります。どのプロセスが正しく動作していないかを示すものを見つけることができないようです。

最も安全なのは、どのプロセス/ pidがSTDOUTに書き込んでいるかを調べることです。

それを行う方法はありますか?

19
TCZ8

Linuxでは、Shellのstdoutが接続されているのと同じリソースに何が書き込まれているのかを知りたい場合、次のようにします。

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

これは、シェルのfd 1と同じファイルで少なくとも1つのファイル記述子が開いているすべてのプロセスのwrite()システムコール(任意のファイル記述子に対する)を報告します。

17

両方の処理を停止するには、SIGSTOPを送信します(pid1とpid2を実際の PIDs で置き換えるか、killallとアプリケーション名を使用します)。

kill -SIGSTOP pid1 pid2

端末(またはstdoutがリダイレクトされる場所)での印刷が停止します。次に、いずれかを使用して続行します

kill -SIGCONT pid1

エラーメッセージがすぐに表示される場合は、最初のプロセスがわかります。そうでない場合は、もう一度停止して2番目を続行できます...

停止したプロセスを強制終了する前に、最初にSIGCONTを送信することをお勧めします。

同じ手法をCtrl-Zとシェルジョブコントロール(fg %1bg %1kill %1、...)でも使用できます。

24
jofel