更多的是概念性的问题。如果我编写的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/

10-14 06:07