web-dev-qa-db-ja.com

ゾンビプロセスを強制終了する別の方法

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か月間実行されています。また、害がなければ、ゾンビを殺すための別の方法はありますか。

19
lese

Heemaylが述べたように、実際にゾンビを殺すことはできません。それはすでに[un] deadです...

ただし、あなたが直面している問題は、git cloneコマンド。どういうわけかスタックします。おそらくタイムアウトするか、他の方法で失敗しますか?プロセスがSIGTERMおよびSIGINTが機能しないところまで動かなくなるのは、多くの場合、I/Oが原因です。

それを殺すために、この場合、-9コマンドラインオプション。つまり、SIGKILLシグナルを送信します。あなたは実際に-KILLも。

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

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

[root@Host user]# kill -l

数字と名前が表示されます(#9がSIGKILLと表示されていることがわかります)。

8
Alexis Wilke

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

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

_kill -CHLD <PPID>
_

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

または、親プロセスを強制終了して、init(PID 1)がゾンビプロセスを継承して適切に取得できるようにすることもできます(これは、initのメインタスクの1つであり、Orphanを継承してwait(2)定期的に)。しかし、親を殺すことは推奨されません。通常、ゾンビプロセスの作成はプログラミングの問題を示し、代わりに修正または報告する必要があります。

39
heemayl

ゾンビプロセスを検索するには:

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" " ")
3
user218243

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

0
Sumanth S