如何立即跳过循环并进入trap命令处理? [BASH]
问题描述:
我的脚本:如何立即跳过循环并进入trap命令处理? [BASH]
#!/bin/bash
finish() {
echo "[$(date -u)] I was terminated."
exit
}
trap finish SIGINT SIGTERM
echo "pid is $$"
while true
do
echo 'I am running'
sleep 15
done
当我发送命令kill -SIGTERM <pid>
的进程中运行我的剧本我要等到sleep 15
会被处决。我GOOGLE了,但没有找到任何答案如何立即跳出循环,并执行trap
当我发送kill
命令。
答
这个问题已经或多或少地在这里回答:Linux: How to kill Sleep。简而言之,执行该脚本的bash
shell会获取kill信号,但sleep
调用不会。
如果你想让进程进入休眠状态,你可以在后台执行sleep
,同时在其上执行wait
。这样,父进程就会得到你的信号并且可以自由处理它。在您的代码:
#!/bin/bash
finish() {
echo "[$(date -u)] I was terminated."
exit
}
trap finish SIGINT SIGTERM
echo "pid is $$"
while true
do
echo 'I am running'
sleep 15 &
wait
done
记住,你的终止信号将被父进程将立即终止被抓到,但sleep 15
仍然会在后台运行,直到它完成。您可以通过添加kill $!
来终止此睡眠过程,这会终止bash
执行的最后一个后台进程。
最后一句话。 wait
可能会等待一个或多个进程完成。没有参数,它会等待所有的子进程完成。如果指定了一个过程,它也会返回最后一个过程的状态。如果没有(例如),它将返回0.
在退出之前放置'kill $!',那么它也会终止睡眠命令。 –
@Ipor Sircer,这是真的。我添加了一个解释。谢谢。 –