![애플리케이션을 다시 시작하는 스크립트를 종료합니다.](https://linux55.com/image/74524/%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84%20%EB%8B%A4%EC%8B%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%A2%85%EB%A3%8C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
응용 프로그램이 종료되었는지 확인하기 위해 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입니다.
이 접근 방식에서 발견한 큰 문제는 "애플리케이션"이 계속 실행 중이지만 "실행기" 스크립트가 이를 다시 모니터링할 수 없다는 것입니다. 어떻게든 "응용 프로그램"을 종료한 다음 "실행기" 스크립트를 호출하여 모니터링되는 "응용 프로그램" 프로세스를 가져와야 합니다.