更多的是一个概念性问题。如果我写一个bash脚本,做睡眠10运行时像Linux:如何杀死睡眠
control_c()
{
echo goodbye
exit #$
}
trap control_c SIGINT
while true
do
sleep 10 #user wants to kill process here.
done
控制+ C不会退出。是否因为linux睡眠忽略了SIGINT?有没有办法规避这一点,并让用户能够按Ctrl + C出睡眠?
更多的是一个概念性问题。如果我写一个bash脚本,做睡眠10运行时像Linux:如何杀死睡眠
control_c()
{
echo goodbye
exit #$
}
trap control_c SIGINT
while true
do
sleep 10 #user wants to kill process here.
done
控制+ C不会退出。是否因为linux睡眠忽略了SIGINT?有没有办法规避这一点,并让用户能够按Ctrl + C出睡眠?
由于睡眠不是bash函数,但外部应用程序,我想Ctrl + C被睡眠进程捕获,通常应该终止它。
因此,对于在睡眠中执行的contorl_c函数,用户必须按两次Ctrl + C:1st - 退出睡眠,2nd被bash陷阱捕获。
当睡眠10运行时,control + c将不会退出。
这是不正确的。即使睡眠正在运行,control + c也会退出。
你确定你的脚本在bash中执行吗?您应该在第一行中明确添加“#!/ bin/bash”。
当我在我的系统上运行脚本(后添加'#!/ bin/bash'),在'sleep 10'结束之前输入Ctrl-C会导致脚本在打印'goodbye'后终止。 –
您所描述的内容与中断信号一致仅适用于您的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
http://stackoverflow.com/questions/26530146/how-to-kill-a-process-in-unix-that-is-often-sleeping –