我设置了两个 bash 脚本,一个启动节点服务器 ( ),另一个运行第一个脚本并在通过( )start-server.sh
终止时重新运行它。SIGTERM
start.sh
start.sh
看起来像这样:
#!/bin/bash
trap './start-server.sh' TERM
./start-server.sh
在 内部start-server.sh
,导出一些环境变量,然后node
启动服务器。
要重新启动所述服务器,我有以下 bash 片段:
kill -TERM "-$(ps -ax -o pgid,command | tr -s " " | grep -E "[[:digit:]]+[[:space:]]+/bin/bash ./start.sh" | xargs | cut -d " " -f 1)"
它将 SIGTERM 发送到由 启动的整个进程组start.sh
,导致所有子进程终止,然后其trap
内部start.sh
重新启动start-server.sh
脚本。
在我的个人机器上运行Pop!_OS 22.04 LTS x86_64
,zsh 5.8.1 (x86_64-ubuntu-linux-gnu)
效果完美。
然而,在我同事的机器上,运行 macOS 和 zsh 5.9,重复运行上述kill
命令在恰好 3 次后停止工作。怎么可能?三次重新启动后,start.sh
它本身会在发出第四次时停止kill
。即使在执行之间等待适量的时间kill
也不会改变这一点。
编辑:
我们现在发现以下内容在两台机器上都有效:
#!/bin/bash
START_SCRIPT_PATH="./start-server.sh"
handle_sigterm() {
echo "Received SIGTERM, will restart"
}
handle_sigint() {
echo "Received SIGINT, will exit"
exit 1
}
trap 'handle_sigterm' SIGTERM
trap 'handle_sigint' SIGINT
while true
do
bash "$START_SCRIPT_PATH"
sleep 1
done
我仍然有兴趣了解为什么第一个解决方案在两台机器上都不起作用,即这两者之间到底有什么区别。这是一个计时问题,第一个解决方案可以start-server.sh
在新的运行开始之前终止时终止吗?看起来很奇怪,因为它反复只在第三次重新启动后停止工作...但是,我们尝试执行 withbash start-server.sh
而不是./start-server.sh
以及其他“信号样式”。这种差异似乎很可能与循环有关。