"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:

관련 정보