我希望无限循环继续运行,并且只能暂时被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。
答案 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;):
指定信号,您也可以使用各自的信号编号。使用以下命令打印信号名称列表:
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?