Linux:如何杀死睡眠

时间:2015-08-17 01:40:32

标签: linux bash sleep

更多的概念性问题。如果我写一个类似

的bash脚本
control_c()
{
echo goodbye
exit #$
}

trap control_c SIGINT

while true
do
sleep 10 #user wants to kill process here.
done
当睡眠10运行时,

control + c不会退出。是因为linux sleep忽略了SIGINT吗?有没有办法绕过这个并让用户能够从睡眠中cntrl + c?

3 个答案:

答案 0 :(得分:9)

您所描述的内容与仅发送到bash脚本而不是进程组的中断信号一致。您的脚本会收到信号,但sleep没有,所以在sleep完成之后,您的陷阱才能执行。标准技巧是在后台运行sleep并在其上wait,以便wait接收中断信号。您还应该明确地将SIGINT发送给仍在运行的任何子进程,以确保它们退出。

control_c()
{
echo goodbye
kill -SIGINT $(jobs -p)
exit #$
}

trap control_c SIGINT

while true
do
sleep 10 &
wait
done

答案 1 :(得分:2)

  当睡眠10运行时,

control + c不会退出。

那不是真的。 control + c DOES退出,即使睡眠正在运行。

你确定你的脚本是在bash中执行的吗?你应该在第一行显式添加“#!/ bin / bash”。

答案 2 :(得分:0)

由于睡眠不是bash功能而是外部app,我认为Ctrl + C会被睡眠过程捕获,通常应该终止它。
因此,对于要在睡眠状态下执行的contorl_c函数,用户必须按Ctrl + C两次:第1次 - 退出睡眠,第2次被bash陷阱捕获。