
私はtestShellというシェルスクリプトを書いた。次のコマンドを使用してこのシェルを実行します。
sudo sh testShell
その後、使用します。
ps -ef|grep testShell|grep -v grep
生成されたプロセスを確認してください。私はシステムが私のために2つのプロセスを作成したことを発見しました。
imcas@ubuntu:~$ ps -ef|grep testShell|grep -v grep
root 5687 32482 0 11:37 pts/1 00:00:00 sudo sh testShell
root 5688 5687 48 11:37 pts/1 00:00:08 sh testShell
ppidでは、1つは親であり、もう1つは子であることがわかります。今実行中のシェルスクリプトを終了したいと思います。私は何をすべきですか?子供を直接殺すべきですか、それとも親を殺すべきですか? kill child を使用すると、
kill -9 5688
子供と両親が両方とも死ぬことがわかりました。しかし、kill parentを使用すると、
kill -9 5687
親だけが死にます。誰でも理由を教えてもらえますか?
答え1
Linuxでは、親プロセスが終了すると、子プロセスは孤立プロセスになります。しかし、「情熱的な」init
プロセスは継続を可能にする孤児プロセスを採用します。
親プロセスとその子プロセスを終了するには、次を使用できます。
pkill -TERM -P <parent's PID>
(注:孤児プロセスはゾンビプロセスと同じではありませんが、これは別の質問です:-)
答え2
sudo
子プロセスが終了したことを親プロセス()に通知します。親プロセスの唯一の目的は、子プロセスを実行することで終了します。子プロセスを終了しても他のプロセスは終了しません。
一方、子プロセスは親プロセスが何をしているかは関係ありません。親プロセスは、子プロセスが作成された直後に終了することもできます。子プロセスの終了コードは独自の終了コードとして必要なので、子プロセスが終了するのをsudo
待ちます。sudo