2017-11-11 43 views
0

我的脚本:如何立即跳过循环并进入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命令。

回答

4

这个问题已经或多或少地在这里回答: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.

+1

在退出之前放置'kill $!',那么它也会终止睡眠命令。 –

+0

@Ipor Sircer,这是真的。我添加了一个解释。谢谢。 –