更多的概念性问题。如果我写一个类似
的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?
答案 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陷阱捕获。