捕获 SIGTERM 并重新启动脚本在 macOS 上精确执行了 3 次

捕获 SIGTERM 并重新启动脚本在 macOS 上精确执行了 3 次

我设置了两个 bash 脚本,一个启动节点服务器 ( ),另一个运行第一个脚本并在通过( )start-server.sh终止时重新运行它。SIGTERMstart.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_64zsh 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以及其他“信号样式”。这种差异似乎很可能与循环有关。

相关内容