2015-08-17 134 views
3

更多的是一个概念性问题。如果我写一个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出睡眠?

+0

http://stackoverflow.com/questions/26530146/how-to-kill-a-process-in-unix-that-is-often-sleeping –

回答

0

由于睡眠不是bash函数,但外部应用程序,我想Ctrl + C被睡眠进程捕获,通常应该终止它。
因此,对于在睡眠中执行的contorl_c函数,用户必须按两次Ctrl + C:1st - 退出睡眠,2nd被bash陷阱捕获。

2

当睡眠10运行时,control + c将不会退出。

这是不正确的。即使睡眠正在运行,control + c也会退出。

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

+0

当我在我的系统上运行脚本(后添加'#!/ bin/bash'),在'sleep 10'结束之前输入Ctrl-C会导致脚本在打印'goodbye'后终止。 –

7

您所描述的内容与中断信号一致仅适用于您的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