更多的是概念性的问题。如果我编写的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吗?有没有一种方法可以避免这种情况并使用户能够在 sleep 状态下退出cntrl + c?
最佳答案
您所描述的内容与仅发送到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
关于Linux:如何消除 sleep ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32041674/