SIGTERMをキャプチャし、再起動スクリプトがmacOSで正確に3回実行されます。

SIGTERMをキャプチャし、再起動スクリプトがmacOSで正確に3回実行されます。

2つのbashスクリプトが設定されています。 1つはノードサーバー()を起動し、もう1つは最初のスクリプトを実行し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_64完璧zsh 5.8.1 (x86_64-ubuntu-linux-gnu)に動作します。

ただし、macOSとzsh 5.9を実行している同僚のコンピュータで上記のkillコマンドを繰り返し実行すると、正確に3回後に動作が停止しました。どうすればいいですか?3回再起動した後、start.sh4番目の問題でそれ自体が停止します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

私は最初の解決策が両方のシステムで機能しない理由、つまりこの2つの違いが正確に何であるかを理解することにまだ興味があります。これはタイミングの問題ですか?start-server.sh新しい実行が開始される前に最初のソリューションが終了することはできますか? 3回目の再起動後に繰り返し動作が停止するので、奇妙に見えます...しかし、私たちはbash start-server.sh代わりに./start-server.sh別の「信号スタイル」を使って実行しようとしました。これらの違いは循環に関連しているようです。

ベストアンサー1

おすすめ記事