SIGTERM을 포착하고 다시 시작 스크립트가 macOS에서 정확히 3번 실행됩니다.

SIGTERM을 포착하고 다시 시작 스크립트가 macOS에서 정확히 3번 실행됩니다.

두 개의 bash 스크립트가 설정되어 있습니다. 하나는 노드 서버( )를 시작하고 다른 하나는 첫 번째 스크립트를 실행하고 start-server.sh( )를 통해 종료될 때 다시 실행합니다.SIGTERMstart.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다른 "신호 스타일"을 사용하여 실행을 시도했습니다. 이러한 차이는 순환과 관련이 있는 것으로 보입니다.

관련 정보