繁体   English   中英

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

[英]How do I stop a signal from killing my Bash script?

我想要一个无限循环继续运行,并且只是暂时被终止信号中断。 我试过 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 信号后运行该函数一次,但以后再也不会运行了。 它停止。

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

我相信您正在寻找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

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

要捕获信号,bash 知道trap命令

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

因此,您想要(我认为这就是您所说的“只是暂时被终止信号中断”):

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

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

trap -l 

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

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

提到的“:”命令在你的脚本中还有另一个潜在用途,如果你有这样的倾向:

while :
do
  sleep 1
done

可以替代“while true” - 不需要反引号,顺便说一句。

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

(my_command) || true

括号在子shell中执行该命令。 true是为了与set -e兼容,如果你使用它。 它只是覆盖状态以始终报告成功。

源码

我发现这个问题很有帮助: 如何在 Bash 脚本退出之前运行命令?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM