![](/img/trans.png)
[英]Writing a bash script, how do I stop my session from exiting when my script exits?
[英]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
命令
通过仅使用信号名称执行陷阱,将陷阱重置为之前的操作。
因此,您想要(我认为这就是您所说的“只是暂时被终止信号中断”):
要指定信号,您也可以使用它们各自的信号编号。 使用以下命令打印信号名称列表:
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.