Kill -9 $PPID プロセスは終了しますか?

Kill -9 $PPID プロセスは終了しますか?

親プロセスを終了すると、子プロセスがinit(PPID = 1)にリンクされていることを読みました。

これをテストするために、3つのシェルを作成し、2番目のシェルに終了シグナルを送信しました。

# first process "a"
a$sh
# second process "b"
sh-5.0$ PS1=b$
b$sh
# thrid process "c"
sh-5.0$ PS1=c$
# killing process "b"
c$kill -9 $PPID
c$Killed
a$exit
a$

(killedと終了は入力されず、画面に印刷されます)

しかし、3番目のシェルもinitに接続されずに終了します。なぜ、誰によって?

ベストアンサー1

あなたの実験を再現してみましょう。

# First shell
$ echo $$
41903

# Start the second shell
$ bash
$ echo $$ $PPID
41934 41903

# Start the third shell
$ bash
$ echo $$ $PPID
41938 41934

2番目の端末では、strace実行されたシステムコールと3番目のシェルで処理された信号を監視します。シェルは入力を待っている間ブロックされます。

$ strace -p 41938
strace: Process 41938 attached
pselect6(1, [0], NULL, NULL, NULL, {[], 8}) = 1 (in [0])

3番目の端末では、2番目のシェル(追跡しているシェルの親)を終了します。

$ kill -9 41934

それから私は観察した。何もないstrace出力では、3番目のシェルはまだ実行中です。

最初の端末に何かを入力しようとすると、出力に次のものが表示されますstrace

read(0, 0x7ffd6879ebbf, 1)              = -1 EIO (Input/output error)
...
write(2, "exit\n", 5)                   = 5
...
setpgid(0, 41938)                       = 0
exit_group(0)                           = ?

3番目のシェルは、read標準入力(ファイル記述子0 - この場合は最初の引数)からデータを読み取ることができず、それ自体で終了します。親プロセスを終了すると、何らかの方法で端末装置の状態が変化し、read()子プロセスが失敗するように見える。

実験を繰り返しますが、今回は最初のシェル(私が終了したいプロセスの親プロセス)を追跡します。

$ echo $$
48134

$ bash
$ echo $$ $PPID
48163 48134

$ bash
$ echo $$ $PPID
48169 48163

別の端末で最初のシェルを追跡します。

$ strace -p 48134
strace: Process 48134 attached
wait4(-1, 

別の端末で2番目のシェルを終了します。

$ kill -9 48163

元の殻は子供の死にどのように反応しましたか?

wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGKILL}], WSTOPPED|WCONTINUED, NULL) = 48163
rt_sigprocmask(SIG_BLOCK, [CHLD TSTP TTIN TTOU], [CHLD], 8) = 0
ioctl(255, TIOCSPGRP, [48134])          = 0

ioctl()パラメータを使用した呼び出しに注意してくださいTIOCSPGRP。最初のシェルが子プロセスが終了したことに気付くと、端末のフォアグラウンドプロセスグループIDを自分自身に変更します(fd 255は端末デバイスの開かれたファイル記述子でもあります)。これがread()3番目のシェルが失敗する原因です。デバイスから読み取ろうとしますが、フォアグラウンドプロセスグループにはありません。

おすすめ記事