いいえ、プロセスを単独で強制終了しても、子プロセスは強制終了されません。
プロセス グループにシグナルを送信する必要があります 特定のグループのすべてのプロセスにシグナルを受信させたい場合
たとえば、親プロセス ID のコードが 1234 の場合、parentpid にマイナス記号を追加してから親プロセス ID を指定する必要があります。
kill -9 -1234
そうしないと、孤児は init
にリンクされます 、3 番目のスクリーンショットに示されているように (子供の PPID は 1 になっています)。
<ブロック引用>
-bash:kill:(-123) - そのようなプロセスはありません
インタラクティブな Terminal.app セッションでは、ジョブ制御/監視モードが有効になっている場合、フォアグラウンド プロセス グループの ID 番号とバックグラウンド プロセス グループの ID 番号は設計上異なります。つまり、ジョブ制御が有効な Terminal.app セッションでコマンドをバックグラウンドで実行すると、$!
バックグラウンド プロセスの pid は、実際には新しいプロセス グループ ID 番号 (pgid) です。
ただし、ジョブ制御が有効になっていないスクリプトでは、そうではない場合があります。バックグラウンド プロセスの pid は、新しい pgid ではなく、通常の pid である可能性があります。そして、これがエラーメッセージ -bash: kill: (-123) - No such process
の原因です 、プロセスグループを強制終了しようとしていますが、kill
に (pgid ではなく) 通常の pid のみを指定しています コマンド。
# the following code works in Terminal.app because $! == $pgid
{
sleep 100 &
IFS=" " read -r pgid <<EOF
$(ps -p $! -o pgid=)
EOF
echo $$ $! $pgid
sleep 10
kill -HUP -- -$!
#kill -HUP -- -${pgid} # use in script
}