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か月間実行されています。また、害がなければ、ゾンビを殺すための別の方法はありますか。
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と表示されていることがわかります)。
ゾンビ(プロセス)を殺すことはできません。すでに死んでいます。親プロセスがwait(2)
を実行して終了ステータスを収集するのを待っているだけです。システムのプロセステーブルエントリ以外のリソースは使用しません。
親にSIGCHLD
を送信して、その子の1つが終了したことを知らせることができます(つまり、子の終了ステータスの収集を要求します)。この信号は無視できます(デフォルト)。
_kill -CHLD <PPID>
_
(_<PPID>
_を親の実際のPIDに置き換えます。)
または、親プロセスを強制終了して、init
(PID 1)がゾンビプロセスを継承して適切に取得できるようにすることもできます(これは、init
のメインタスクの1つであり、Orphanを継承してwait(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" " ")
親プロセスが終了すると、すべてのゾンビプロセスがクリーンアップされます。ゾンビプロセスをクリーンアップするためだけに親プロセスを終了しないでください。プログラムを再実行すると再び表示されます。 「wait()」または「waitpid()」システムコールを正しく呼び出すようにプログラムを修正します。