私の同僚の 1 人が今朝、"kill -9" で Supervisord を強制終了したとき、supervisord のサブプロセスが強制終了されていないことを教えてくれました。
彼はそれについてかなり確信していますが、私は何度も試してみましたが、それが起こることはありませんでした.
親プロセスが「kill -9」によって強制終了された場合、Linux はそのサブプロセスも確実に強制終了されるのでしょうか?
いいえ、親が強制終了されたときに子プロセスが強制終了されるとは限りません。
ただし、子が書き込み中のパイプを開いており、親が読み取り中の場合、次にパイプに書き込もうとすると SIGPIPE を取得します。デフォルトのアクションは、それを強制終了することです。それは実際によくあることです。
父親が殺された (または死んだ) ときにサブプロセスを強制終了させるには、サブプロセスをデーモン化する必要があります。そうしないと、init(1) によって採用されます。
UNIXでは、親プロセスと子プロセスの存続期間の間に強制的な関係はありません。厳密に言えば、プロセスは、exit()を呼び出すか、デフォルトのアクションが終了する未処理のシグナルを受信した場合にのみ終了します。
ただし、「制御端末」の「フォアグラウンドプロセスグループ」全体は、ユーザーがその端末でctrl-C、ctrl- \などを押すと、SIGINTやSIGQUITなどのシグナルを受信できます。特定の動作は、ログインシェルによって部分的に実装されます(ttyドライバーの助けを借りて)。詳細はかなり複雑かもしれません:こことここを見てください
プロセスの親プロセスIDである端末pidを閉じると、端末が閉じられます。また、ターミナルが閉じられると、そのすべてのプロセスも強制終了されます。ただし、シェルでサブシェルを作成した場合、プロセスを作成してそのプロセスの ppid を強制終了すると、そのサブシェルのみが強制終了され、その子は孤児になります。親は init になり、pid は 1 です。
[研修生@SIPL ~]$ ps -ef | grep sleep trainee 3893 3870 0 10:55 pts/1 00:00:00 sleep 4000 trainee 3895 3788 0 10:55 pts/0 00:00:00 grep --color=auto sleep [trainee@SIPL ~]$ kill - 9 3870 [研修生@SIPL ~]$ ps -ef | grep sleep trainee 3893 1 0 10:55 pts/1 00:00:00 sleep 4000 trainee 3906 3788 0 10:55 pts/0 00:00:00 grep --color=自動スリープ
どのプロセスまたはサービスを強制終了するかを知る必要があります。私の場合は httpd です。
killall -9 httpd
httpd のすべての子プロセスを強制終了します。