我有一个更复杂的脚本,但我设法生成一个表现出相同问题的短脚本。
我创建了一个流程并使其成为会话领导者,然后向其发送SIGINT
。 kill
内置函数不会失败,但该过程也不会被杀死(即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
没有报告失败,因此该过程应该已经死亡)但确实如此。
我正在寻找上述行为的解释,以及如何杀死一个进程组(即它开始的bash
和sleep
- 上面的setsid行)单独会议。
答案 0 :(得分:2)
我认为您会发现sleep
忽略SIGINT
。查看sleep
命令的the signals,然后查看。在我的Linux机器上,我发现:
SigIgn: 0000000000000006
设置右边的第二位(6 = 4 + 2 + 0),并从上面的链接:
--> 2 = SIGINT
尝试发送一个HUP
,你会发现它确实会扼杀睡眠。