如何使用bash中的kill杀死进程组?

时间:2016-10-25 17:42:10

标签: bash shell signals

我有一个更复杂的脚本,但我设法生成一个表现出相同问题的短脚本。

我创建了一个流程并使其成为会话领导者,然后向其发送SIGINTkill内置函数不会失败,但该过程也不会被杀死(即SIGINT的默认行为是kill)。我尝试使用kill -INT -pid(这应该与我当前所做的相同)和/bin/kill命令,但行为是相同的。

脚本如下:

#!/bin/bash

# Run in a new session so that I don't have to kill the shell
setsid bash -c "sleep 50" &

procs=$(ps --ppid $$ -o pid,pgid,command | grep 'sleep' | head -1)
if [[ -z "$procs" ]]; then
    echo "Couldn't find process group"
    exit 1
fi

PID=$(echo $procs | cut -d ' ' -f 1)
pgid=$(echo $procs | cut -d ' ' -f 2)

if ! kill -n SIGINT $pgid; then
    echo "kill failed"
fi

echo "done"

ps -P $pgid

我的期望是,最后一个ps命令不应该报告任何内容(因为kill没有报告失败,因此该过程应该已经死亡)但确实如此。

我正在寻找上述行为的解释,以及如何杀死一个进程组(即它开始的bashsleep - 上面的setsid行)单独会议。

1 个答案:

答案 0 :(得分:2)

我认为您会发现sleep忽略SIGINT。查看sleep命令的the signals,然后查看。在我的Linux机器上,我发现:

SigIgn: 0000000000000006

设置右边的第二位(6 = 4 + 2 + 0),并从上面的链接: --> 2 = SIGINT 尝试发送一个HUP,你会发现它确实会扼杀睡眠。