2016-05-27 8 views
0

私はプロセスがparentプロセスであり、ssh接続をそれぞれ監視するさまざまなchildプロセスを生成するユースケースを持っています。このparentプロセスは、サービスの一部として無限に実行する必要があります。しかし、これらのうちの1つが閉じられると、childプロセスはzombieプロセスになります。このようにして、ssh接続が閉じられるたびに多くのプロセスが作成されています(zombie)。ゾンビプロセスの削除

プロセスの数を可能な限り少なくしたいと考えています。私が知る限り、SIGTERMまたはSIGKILLは、zombieプロセスを削除します。 parentプロセスが無限に実行されているので、zombieプロセスは、parentが終了するのを待って削除できません。

ゾンビプロセスを削除する方法はありますか?それとも私が間違って理解していること?

答えて

1

Cプログラミングでは、親プロセスでwaitpidシステムコールを使用できます。

linuxのコマンドラインまたはシェルスクリプトでは、waitコマンドを使用してゾンビを削除できます。

waitpidのmanページのpid引数で指定された子の状態が変化するまで、

のwaitpid()システムコールは、呼び出しプロセスの実行を中断します。デフォルトでは、waitpid()は終了した子のみを待ちますが、この動作はoptions引数で変更できます。

構文: -

pid_t waitpid(pid_t pid, int *status, int options); 

あなたが親を一時停止したくない場合は、あなたはゾンビプロセスをクリアするために呼び出す怒鳴るシステムを使用しています。

int status; 
waitpid(0, &status, WNOHANG); 

親プロセスが子終了ステータスを受け取ると、ゾンビプロセスのみが作成されます。したがって、WNOHANGオプション付きのwaitpidを使用すると、子exit stausを受け取ることができます.WNOHANGオプションが指定されている場合、親をブロックしません。 exit変数をstatus変数に格納して戻ってくる子があるかどうかを調べます。さもなければ、それは待っていない、単にそれを返す。

waitpidのマニュアルページで、waitpidシステムコールの情報を参照してください。

+0

私はPythonを使用しています。私は同じことを試みた。 'join()'の代わりに 'os.waitpid(pid、os.WNOHANG)'に置き換えました。まだ「ゾンビ」プロセスが作成されています。私は何か間違っているのですか? – nidHi

+0

waitpidの戻り値を確認しましたか? –

+0

私はPythonで知らない。しかし、私は、os.waitpidに何らかの議論をして現状を知る必要があると思いますか? –