두 개의 bash 스크립트가 설정되어 있습니다. 하나는 노드 서버( )를 시작하고 다른 하나는 첫 번째 스크립트를 실행하고 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번 후에 작동이 중지되었습니다. 어떻게 그럴 수 있습니까?세 번 다시 시작한 후 start.sh
네 번째 문제에서 자체적으로 중지됩니다 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
나는 첫 번째 솔루션이 두 시스템 모두에서 작동하지 않는 이유, 즉 이 둘의 차이점이 정확히 무엇인지 이해하는 데 여전히 관심이 있습니다. 이것은 타이밍 문제입니까? start-server.sh
새 실행이 시작되기 전에 첫 번째 솔루션이 종료될 수 있습니까? 세 번째 재부팅 후에만 반복적으로 작동이 멈추기 때문에 이상해 보입니다... 그러나 우리는 bash start-server.sh
대신 ./start-server.sh
다른 "신호 스타일"을 사용하여 실행을 시도했습니다. 이러한 차이는 순환과 관련이 있는 것으로 보입니다.