为什么SIGINT可以在终端中停止bash但不能通过kill -INT停止?

时间:2014-07-25 07:26:59

标签: linux bash shell signals

我注意到当我通过像这样的bash脚本运行挂起过程时

foo.sh:

sleep 999

如果我通过命令运行它,然后按Ctrl + C

./foo.sh
^C

睡眠将被打断。但是,当我尝试用SIGINT

杀死它时
ps aux | grep foo
kill -INT 12345  # the /bin/bash ./foo.sh process

然后它看起来像bash和sleep忽略SIGINT并继续运行。这让我感到惊讶。我以为Ctrl + C实际上是在向前台进程发送SIGINT,那么为什么终端中的Ctrl + C和kill -INT的行为会有所不同?

2 个答案:

答案 0 :(得分:3)

Ctrl C 实际上将SIGINT发送到前台进程(由bash进程组成,和sleep过程)。要使用kill命令执行相同操作,请将信号发送到进程组,例如:

kill -INT -12345

答案 1 :(得分:2)

你的脚本正在执行“sleep 999”,当你按下CTRL-C时,运行sleep命令的shell会将SIGINT发送到它的前台进程,sleep。但是,当您尝试使用kill从另一个窗口中杀死shell脚本时,您没有以“sleep”进程为目标,而是以父shell进程为目标,即捕获SIGINT。相反,找到“睡眠999”的进程ID并杀死-2它,它应该退出。

简而言之,您在测试用例中杀死了2个不同的进程,并将苹果与橙子进行比较。

root     27979 27977  0 03:33 pts/0    00:00:00 -bash   <-- CTRL-C is interpreted by shell
root     28001 27999  0 03:33 pts/1    00:00:00 -bash
root     28078 27979  0 03:49 pts/0    00:00:00 /bin/bash ./foo.sh
root     28079 28078  0 03:49 pts/0    00:00:00 sleep 100  <-- this is what you should try killing