在bash
脚本中,是否有一种简单的方法来等待信号,例如:
wait -s SIGINT
管他呢?也许只是trap
?
答案1
不。
wait
专门用于父进程等待子进程的终止(并访问其退出状态)。
此外,没有任何进程可以捕获KILL
信号(用作示例的原始问题KILL
)。
另外,“等待信号”是一件不寻常的事情,因为信号是异步事件,这意味着您不需要等待对于它们,而是安装一个信号处理程序(trap
在 shell 中使用)来处理信号每当它到达了。信号可能在脚本执行期间的任何时间到达,并且信号处理程序将在发生这种情况时执行(在处理信号时,正常的程序流程将暂时暂停)。
显然,你可以做类似的事情
trap 'quit=1' USR1
quit=0
while [ "$quit" -ne 1 ]; do
printf 'Do "kill -USR1 %d" to exit this loop after the sleep\n' "$$"
sleep 1
done
echo The USR1 signal has now been caught and handled
执行某种“等待信号到达”循环。
在这里,“陷阱”将“捕获”信号USR1
,“处理程序”将设置quit
为1
,控制权将返回到代码,从而退出循环。