ゾンビプロセスを殺す別の方法


19

CentOS 6.8(Final)のゾンビプロセスに気づき、それらを強制終了しようとしましたが、まだそこにあります。

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

ご覧のとおり、彼らは2か月間実行されていますが、もしそれらが有害でなければ、ゾンビを殺す別の方法はありますか?


1
試しましたkill -9か?
Iporサーサー

7
のみ74729971ゾンビプロセスです。他の人は閉じ込められているかもしれませんが、彼らはまだ死んでいません。
ロアイマ

Tomcatで実行されているコードにバグがあるようです...
Boris the Spider

回答:


8

Heemaylが述べたように、実際にゾンビを殺すことはできません。すでに死んでいます...

ただし、直面している問題は、git cloneコマンドの問題のように見えます。それはどういうわけか立ち往生します。おそらく他の方法でタイムアウトまたは失敗しますか?多くの場合、何らかのI / Oが原因で、プロセスはa SIGTERMとa SIGINTが機能しないポイントに固定されます。

この場合、それを強制終了するには、-9コマンドラインオプションを使用します。これは、SIGKILL信号を送信することを意味します。実際に使用すること-KILLもできます。

[root@host user]# kill -KILL 746 29970

使用可能な信号のリストを取得するには、listコマンドラインオプションを使用します。

[root@host user]# kill -l

これにより、番号と名前が表示されます(#9がSIGKILLと表示されていることがわかります)。


1
実際kill -KILL、これらのプロセスを閉じることができる唯一のコマンドでした。そのため、@ Alexis Wilkeの回答を受け入れます。しかし、@ heemaylの迅速で賢明で非常に有益な回答+1に感謝したいと思います。皆に感謝します
-lese

39

ゾンビ(プロセス)を殺すことはできません。すでに死んでいます。親プロセスがwait(2)終了ステータスを収集するのを待っています。プロセステーブルエントリ以外のシステム上のリソースは使用しません。

SIGCHLD親に送信して、子の1つが終了したことを知らせることができます(つまり、子の終了ステータスを収集するように要求します)。このシグナルは無視できます(これがデフォルトです)。

kill -CHLD <PPID>

<PPID>親の実際のPIDに置き換えます。)

または、init(PID 1)がゾンビプロセスを継承して適切に刈り取るように親プロセスを強制終了することができます(init孤立プロセスを継承してwait(2)定期的に行うのは、メインプロセスの1つです)。しかし、親を殺すことはお勧めできません。一般的に、ゾンビプロセスの作成はプログラミングの問題を示しているため、代わりに修正または報告を試みる必要があります。


8
あなたは、この信号は無視することができ、それはそれの子が終了した場合は、1つは(すなわちコレクト子供の終了ステータスにそれを要求する)ことを知っているように、それの親にSIGCHLDを送信することができます(デフォルトでは) それに伴う問題は、そのプロセスを無視した場合SIGCHLD、何のゾンビません作成されます。したがって、無視しない場合SIGCHLD、およびゾンビが刈り取られない場合、プロセスはバグがあるか、ゾンビの子を気にしません。問題のプロセスがであるとするとgit clone ...、ゾンビの子供を気にしないと思うのは、それが(できれば)短命のプロセスであり、その仕事をしてから終了するからです。
アンドリューヘンレ

1
@AndrewHenle:それはほとんど真実ですが、デフォルトのアクション(SIG_DFLSIGCHILDはそれを無視することでもありますが、この場合、ゾンビはほとんど確実に自動的に収獲されません。
R ..

@Rこれはほとんど真実ですが、デフォルトのアクション(SIG_DFLSIGCHILDはそれを無視することでもありますが、この場合、ゾンビはほとんど確実に自動的に回収されません。 何を言っているのか分かりません。質問で得られないプロセスについて言及していますか?ハンドラーが(明示的またはデフォルトで)設定されSIGCHLDているプロセスに送信すると、そのプロセスがゾンビを獲得する方法がわかりません。SIGCHLDSIG_IGN
アンドリューヘンレ

1
送信@AndrewHenle、SIGCHLD動作する可能性があり、この時間を。最後に信号を見逃したか、2人の子供が同時に死亡した可能性があり、コードは両方の死を同時に処理するほど賢くありません。
アレクシスウィルク

痛いことはありませんが、私はそれがうまくいくことを期待していません。
バーマー

2

ゾンビプロセスを探すには:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

ゾンビプロセスを強制終了するには、親ID、つまりPPIDを強制終了する必要があります。

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

親プロセスが停止すると、すべてのゾンビプロセスがクリーンアップされます。ゾンビプロセスをクリーンアップするためだけに親プロセスを殺さないでください。プログラムを再実行すると再び表示されます。「wait()」または「waitpid()」システムコールを適切に呼び出してプログラムを修正します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.