쉘 스크립트에서 다음을 수행합니다.
#!/bin/sh
while true; do <some application>; sleep 1; done &
... rest of the scrip ...
이는 스크립트의 나머지 부분에 필요한 것이므로 응용 프로그램이 항상 실행되도록 보장합니다. 하지만 스크립트는 탄력적이므로 애플리케이션이 실행 중이 아니고 잘못 응답하는 것 같지 않으면 나중에 다시 시도합니다.
SIGTERM
예를 들어 또는 로 인해 기본 스크립트가 종료되면 이 루프도 중지되기를 SIGINT
원합니다 . while
기본 스크립트가 종료된 후에도 애플리케이션을 계속 실행할 필요가 없습니다.
쉘 스크립트에서 이를 수행하는 일반적인 방법은 무엇입니까? 제가 원하는 것은 두 가지입니다.
- 애플리케이션 재실행 방지
- 현재 실행 중인 애플리케이션 인스턴스를 가능한 한 빨리 중지하세요.
쉘 스크립트에서 이 작업을 수행하는 방법을 모르겠습니다. INT
and를 캡처할 수 있지만 루프에 논리를 삽입하는 방법 과 애플리케이션을 중지하는 방법을 TERM
잘 모르겠습니다 .while
현재 일반에서 작업 중이지만 필요하면 sh
계속할 수 있습니다 .bash
답변1
스크립트에서 원하는 것은 무한 루프가 아니라 잠긴 파일입니다.
그런 다음 래퍼 스크립트에서 작업을 수행하는 스크립트를 호출합니다.
#!/bin/sh
if [ -f /tmp/.lock.my-mgr ]
then
echo "Program in use ... exiting ..."
exit 10
fi
/bin/touch /tmp/.lock.my-mgr
/usr/local/bin/myscript.sh
/bin/rm /tmp/.lock.my-mgr
이 작업을 몇 분마다 일괄적으로 실행하려면 cron을 사용하여 작업을 예약하세요.
편집하다:
루프와 함께 실행되는 스크립트의 PID는 다음 내용이 포함된 파일에 넣을 수 있습니다.
echo $! > /var/tmp/script1.pid
(스크립트에서).
두 번째 스크립트에서 실행되는지 테스트하려면 ps 명령을 사용하십시오.
ps -p `cat /var/tmp/script1.pid`
그런 다음 $?를 사용하여 해당 상태를 테스트합니다. ps가 pid를 찾으면 변수는 0이어야 하고, 그렇지 않으면 1이어야 합니다. 이것은 기본적인 논리이지만 pid 파일이 존재하지 않는 경우와 같이 더 나은 테스트를 통해 작성할 수 있습니다.
답변2
while true; do <some application>; sleep 1; done &
myloop=$! # get the pid of the child
# kill $myloop
# where/when you think you need to stop the child process
&
백그라운드에서 자식 프로세스를 만듭니다. fg
고려해야 할 유사한 작업을 처리하는 다른 명령이 있습니다 .