長すぎる。

長すぎる。

質問があります。プロセス管理の研究中、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+を押すときの一般的な信号は実際にはそうではありませんC15 <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>

関連情報