どのプロセスがSTDOUTに書き込みを行っているかを調べる方法は?


19

実行中のプロセスの2つのインスタンスがあります。それらの1つは「frEAkIng oUT!」です。また、印刷エラーはSTDOUTに止まりません。

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

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

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


1
stdoutへの書き込みは、ファイル記述子1((問題のプロセスの)これは端末またはのようなものである可能性がある)への書き込みを意味します/dev/null。代わりに特定のファイル(端末デバイスやログファイルなど)を意味するものではないのですか?
ステファンシャゼラス14

両方が同じシェルで開始された場合は、両方ともSTDOUTに書き込みを行うため、これを固定しても2つのうちどちらを殺すかを特定するのに役立ちません。ジョフェルの方法は、おそらくあなたが探しているものです。
slm

彼が本当に意味するのは、ターミナルで出力を生成しているものです
バーマー14

回答:


17

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

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

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


それが最初に私が念頭に置いていたものです、私は両方のおかげで両方の方法を試します。
TCZ8 14

23

SIGSTOPを送信することで、両方の処理を停止できます(pid1とpid2を実際のPIDまたはuse killallとアプリケーション名で置き換えます)。

kill -SIGSTOP pid1 pid2

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

kill -SIGCONT pid1

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

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

同じ技術は、一緒に使用することができるCtrl-Zとシェルジョブコントロール(fg %1bg %1kill %1、...)。


1
それはそれをトラブルシューティングするのに非常に良い方法ですが、私は本当に誰がターミナルに書いているのかを追跡する方法を探していました。ありがとう
TCZ8 14

この質問を読み直しただけで、最後のコメントを書いている間に頭がおならだったようです。これは私の問題も解決します。THX。
TCZ8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.