bashを使用してモニタリングプログラムを開発しています。プログラムは継続的に実行され、bashコードを更新すると終了せずに新しいコードを再実行する必要があります(デフォルトではホットアップグレード)。
私はSIGUSR2を使用して同じスクリプトを再実行してこれを試しました。
最初はうまく動作し、SIGUSR2シグナルをキャプチャし、新しいスクリプトを実行します。ただし、最初の実行後は、SIGUSR2に応答しなくなります。
#!/bin/bash
VERSION=v1
upgrade()
{
export GOT_UPGRADED=true
echo "Upgrading..."
exec $HOME/workspace/test/upgrade_test
}
init()
{
if [[ $GOT_UPGRADED != true ]]; then
# won't initialize again, if it's got upgraded.
echo "Initializing..."
fi
}
monitor()
{
echo "$VERSION: Monitoring..."
}
trap upgrade SIGUSR2 # if SIGUSR2 is received, upgrade.
init
while true; do
monitor
sleep 1
done;
実行例:
shell1: ./upgrade_test
Initializing...
v1: Monitoring...
v1: Monitoring...
v1: Monitoring...
v1: Monitoring...
v1: Monitoring...
Upgrading... # Sent from shell2
v1: Monitoring...
v1: Monitoring...
v1: Monitoring...
v1: Monitoring...
Meanwhile in shell2:
pkill -SIGUSR2 -f upgrade_test; # here it got upgraded
pkill -SIGUSR2 -f upgrade_test; # THE PROBLEM: doesn't work anymore
実行後もSIGUSR2ハンドラを引き続き機能させる方法は?
ありがとう、
ベストアンサー1
bash
バージョン4.4に適用可能
#!/bin/bash
########################################################################
#
trapped()
{
echo "Oh oh I'm trapped"
exec "$0" "$@"
echo "exec failed: $0 $*"
exit 1
}
########################################################################
# Go
#
trap trapped SIGUSR2
echo "Running new instance as PID $$"
while :
do
read -p "$(date): " -t 120 X; ss=$?; echo
[[ $ss -eq 1 ]] && exit
done
これを実行するには/tmp/trap.sh
、
Running new instance as PID 3899
11 Mar 2021 10:29:22: Oh oh I'm trapped
Running new instance as PID 3899
11 Mar 2021 10:29:36: Oh oh I'm trapped
Running new instance as PID 3899
11 Mar 2021 10:29:38: