私は時々死んだプロセスを生成する大規模なアプリケーション(C ++で書かれています)を持っています。私はアプリケーションが内部的に多くのLinuxコマンドを使用していることを知っています。存在しないshプロセスでどのLinuxコマンドを呼び出したかを知る必要があります。見つけることができますか?または、私のアプリケーションがLinuxコマンドを呼び出すときにLinuxを設定して何らかのログを取得できますか?
ありがとうございます。
ルーク
答え1
~からウィキペディア:
デッドプロセスは、実行は完了していてもプロセステーブルにエントリがあるプロセスです。この項目は、(現在のゾンビ)プロセスを開始したプロセスが終了状態を読み取ることができるようにするためにまだ必要です.
C ++コードが呼び出しを実行していますかwait()
?wait()
期限切れのプロセスを呼び出して終了ステータスを取得した場合、そのプロセスは消えなければなりません。
答え2
popen
この大規模アプリケーションは、同様のライブラリ機能を使用してシェルを介して外部コマンドを実行します。アプリケーションが呼び出さないため、中間シェルはゾンビ(「死んだプロセス」)のままです。wait
その子供たちを「収穫」します。ゾンビプロセスは完全に無害です(B映画で何を信じても)。ゾンビプロセスが消費する唯一のリソースは、プロセステーブルのエントリです。
以下を実行して、アプリケーションで実行されたコマンドを追跡できます。
strace -f -s99999 -v -eexecve -o big-application.strace ./big-application
これにより、プログラムが少し遅くなる可能性があります。プロセスの存続期間中にトレースをオンまたはオフにできます。追跡を開始するには:
strace -f -s99999 -v -eexecve -o big-application.strace -p 12345
ここで、12345 は追跡するプロセス ID です。トレースを停止するには、strace
プロセスを終了します(例:Ctrl+押す)。C