如何阻止信号杀死我的Bash脚本?

时间:2014-07-20 08:49:05

标签: bash signals kill

我希望无限循环继续运行,并且只能暂时被kill信号中断。我试过SIGINT,SIGUSR1,SIGUSR2。所有这些似乎都停止了循环。我甚至尝试过SIGINFO,但Linux不支持。

#!/bin/bash
echo $$ > /tmp/pid  # Save the pid

function do_something {
    echo "I am doing stuff" #let's do this now, and go back to doing the thing that is to be done over and over again.
#exit
}


while :
do
    echo "This should be done over and over again, but always wait for someething else to be done in between"

    trap do_something SIGINT
    while `true`
    do
            sleep 1 #so we're waiting for that other thing.
    done

done

我的代码在从另一个脚本获取INT信号后运行该函数一次,但之后再也没有。它停了下来。

编辑:虽然我不小心把退出放在函数的末尾,但在Stack Overflow上,我没有在我使用的实际代码中。无论哪种方式,它没有任何区别。解决方案是Tiago所描述的SIGTERM。

3 个答案:

答案 0 :(得分:2)

我相信你正在寻找SIGTERM

示例:

#! /bin/bash

trap -- '' SIGINT SIGTERM
while true; do
    date +%F_%T
    sleep 1
done

运行此示例cTRL+C不会将其删除,也不会kill <pid>您可以使用kill -9 <pid>将其删除。

如果您不希望CTRL+Z中断使用:trap -- '' SIGINT SIGTERM SIGTSTP

答案 1 :(得分:1)

捕获信号,然后在与陷阱关联的函数中对其作出适当的反应,或者通过例如associate:as命令来忽略它,以便在信号发生时执行。

捕获信号,bash知道trap命令

通过仅使用信号名称执行陷阱,将陷阱重置为以前的操作。

因此你想(我认为你想要的是&#34;只是暂时被杀死信号打断&#34;):

  • 在脚本开头捕获信号:陷阱信号custom_action
  • 就在您希望信号允许中断脚本之前,执行:trap signal
  • 在该阶段结束时,再次陷入:signal custom_action

指定信号,您也可以使用各自的信号编号。使用以下命令打印信号名称列表:

trap -l 

kill发送的默认信号是SIGTERM(15),除非你在kill命令后指定一个不同的信号

不要退出do_something函数。只需让函数返回到代码中发生信号时被中断的部分。

提及&#34;:&#34;命令在你的脚本中有另一个潜在的用途,如果你有这样的倾向:

while :
do
  sleep 1
done

可以替代&#34;而真实&#34; - 顺便说一句,不需要反叛。

答案 2 :(得分:0)

您只想忽略退出状态。
如果您希望脚本继续运行而不退出而不必担心处理陷阱。

(some comand that exits) && true

在子shell中执行命令,并确保以set -e开头的bash在命令后不会死亡。

有关详细信息,请参阅reference

我找到了answer 对这个问题有所帮助。 Bash: run command before a script exits?