「exec」コマンドの後、「trap」は機能しません。

「exec」コマンドの後、「trap」は機能しません。

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:

おすすめ記事