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: