애플리케이션을 다시 시작하는 스크립트를 종료합니다.

애플리케이션을 다시 시작하는 스크립트를 종료합니다.

응용 프로그램이 종료되었는지 확인하기 위해 wait()를 사용하는 bash 쉘 스크립트가 있습니다. 그러나 스크립트/응용 프로그램을 종료하고 싶을 때 종료하는 데 문제가 있습니다. 스크립트의 아이디어는 응용 프로그램이 죽거나 소프트웨어 업데이트가 필요한 경우 응용 프로그램을 다시 시작하는 것이지만 응용 프로그램을 다시 시작하지 않고 응용 프로그램을 종료하려면 백도어 또는 신호 트랩이 필요합니다.

업데이트 후 다시 시작하면 프로그램이 종료되고, 어쨌든 애플리케이션이 종료되면 프로그램도 다시 시작됩니다. 그게 내가 필요한 전부입니다. 그러나 특정 목적을 위해 애플리케이션을 다시 시작하지 않고 이 스크립트를 종료하는 특별한 방법도 필요합니다.

스크립트는 다음과 같습니다.

# Initial Launch of the application
/app &

while true
do

   PID=$! #process ID of app

   # The app background process uses exit(0) to possibly end.
   wait $PID 

   if [ -f $FILE ];
   then
      echo "Update successfully"
      mv appcp app
      chmod "+x" app
      /app & # restart
   else
      #error happened if file does not exist 
      #restart
      /app &
   fi
done

답변1

이런 종류의 작업이 작동할 수 있습니다. 시작 스크립트가 SIGINT를 받으면 호출되는 "quitter"라는 셸 함수에 "트랩"을 추가했습니다.

#!/bin/bash

function quitter {
    echo "SIGINT handler, disowning $PID"
    disown $PID
    exit 1;
}

trap quitter SIGINT

FILE=appcp
./app 1000 &
PID=$! #process ID of app

while true
do
   # The app background process uses exit(0) to possibly end.
   wait $PID
   if [[ -f $FILE ]]
   then
      echo "Update successfully"
      mv $FILE app
      chmod "+x" app
      ./app &
   else
      echo plain restart
      ./app &
   fi
   PID=$! #process ID of app
done

트랩 핸들러 함수 내에서 수행하는 것이 올바른지 잘 모르겠지만 disown, 무엇을 하려는지 잘 모르겠습니다. 컴파일된 프로그램을 사용하여 스크립트를 실행하면 프로그램이 1000초 동안 "응용 프로그램"으로 잠자기 상태가 됩니다. "스타터" 프로그램의 Ctrl-C를 누르면 "앱"이 실행됩니다. 이는 bash커널 4.1.9가 설치된 최신 x86_64 Arch Linux 시스템의 4.3.042-3입니다.

이 접근 방식에서 발견한 큰 문제는 "애플리케이션"이 계속 실행 중이지만 "실행기" 스크립트가 이를 다시 모니터링할 수 없다는 것입니다. 어떻게든 "응용 프로그램"을 종료한 다음 "실행기" 스크립트를 호출하여 모니터링되는 "응용 프로그램" 프로세스를 가져와야 합니다.

관련 정보