我注意到当我通过像这样的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的行为会有所不同?
答案 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