
質問があります。プロセス管理の研究中、CentOS 7で奇妙な動作を観察しました。親プロセスが終了すると、子プロセスも終了することがわかります。ただし、次の場合にはそうではありません。たとえば、ddコマンドを実行しました。
[root@server2 ~]# dd if=/dev/zero of=/dev/null &
[1] 1756
[root@server2 ~]# ps fax | grep -B2 dd
1737 pts/2 S 0:00 \_ su -
1741 pts/2 S 0:00 \_ -bash
1756 pts/2 R 1:18 \_ dd if=/dev/zero of=/dev/null
その後、bashである親プロセスを終了(SIGKILLシグナルを使用)しようとしますが、これはddプロセスを終了しません。
[root@server2 ~]# kill -9 1741
Killed
[user@server2 ~]#
シェルは終了しますが、トップレベルのコマンド出力からわかるように、ddプロセスは引き続き機能します。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1756 root 20 0 107948 612 512 R 99.9 0.1 10:06.98 dd
これについてどんな考えがありますか?
答え1
デフォルトでは、親プロセスを終了しても子プロセスは終了しません。
プロセスグループ(負のPID)を使用して親プロセスと子プロセスを終了する方法についての他の質問を見つけることをお勧めします。
これを行う方法の詳細な回答は、以下にあります。プロセスの子孫
答え2
似たような状況にぶつかり、答えを見つけました。
長すぎる。
努力する:kill -2 <parent_pid>
Ctrlスクリプトの実行中に+を押すと、C親プロセスと生成されたすべてのプロセスが終了した場合にこの方法がうまくいくかどうかがわかります。
その理由は、kill
さまざまな信号を送信できるためです。信号はデフォルトでkill <pid>
送信されます15 <SIGTERM>
。ただし、Ctrl+を押すときの一般的な信号は実際にはそうではありませんC。15 <SIGTERM>
2 <SIGINT>
したがって、これが+で中断するkill -2 <pid>
ように親プロセスを終了する場合CtrlC
答え3
特に kill コマンドの場合は、必要に応じて調整してください。
function kill_recurse() {
cpids=`pgrep -P $1|xargs`
for cpid in $cpids;
do
kill_recurse $cpid
done
echo "killing $1"
kill -9 $1
}
使用例は次のとおりです。kill_recurse <my_parent_pid>