2つのbashスクリプトが設定されています。 1つはノードサーバー()を起動し、もう1つは最初のスクリプトを実行し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回後に動作が停止しました。どうすればいいですか?3回再起動した後、start.sh
4番目の問題でそれ自体が停止します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
別の「信号スタイル」を使って実行しようとしました。これらの違いは循環に関連しているようです。