Linux:如何终止休眠状态

7

这是一个概念性问题。如果我编写一个Bash脚本,执行类似于以下内容的操作:

control_c()
{
echo goodbye
exit #$
}

trap control_c SIGINT

while true
do
sleep 10 #user wants to kill process here.
done

当执行sleep 10时,按下control+c无法退出。这是因为Linux的sleep忽略了SIGINT信号吗?是否有方法规避此问题并使用户能够使用control+c退出sleep?


http://stackoverflow.com/questions/26530146/how-to-kill-a-process-in-unix-that-is-often-sleeping - Rakholiya Jenish
3个回答

13

你所描述的情况表明中断信号只传递到你的bash脚本,而不是进程组。你的脚本接收到信号,但sleep没有接收到,因此你的陷阱无法在sleep完成之前执行。通常的技巧是在后台运行sleep并等待它,以便wait接收中断信号。然后,你还应显式地向任何仍在运行的子进程发送SIGINT,以确保它们退出。

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

trap control_c SIGINT

while true
do
sleep 10 &
wait
done

按下ctrl-d或者ctrl-c(打印^C)没有任何作用,这正常吗? - alper

1

当“sleep 10”正在运行时,“control+c”无法退出。

这并不是真的。即使正在运行“sleep”,“control+c”也可以退出。

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


1
当我在我的系统上运行脚本(添加 #!/bin/bash 后),在 sleep 10 完成之前键入 Ctrl-C 会导致脚本在打印“goodbye”后终止。 - Keith Thompson

0

由于sleep不是bash函数而是外部应用程序,我猜Ctrl+C被sleep进程捕获了,这通常应该终止它。
因此,在睡眠状态下执行contorl_c函数,用户必须按两次Ctrl+C:第一次退出睡眠,第二次被bash陷阱捕获。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接