기본 스크립트가 중지되면 인라인 백그라운드 프로세스를 어떻게 중지합니까?

기본 스크립트가 중지되면 인라인 백그라운드 프로세스를 어떻게 중지합니까?

쉘 스크립트에서 다음을 수행합니다.

#!/bin/sh

while true; do <some application>; sleep 1; done &

... rest of the scrip ...

이는 스크립트의 나머지 부분에 필요한 것이므로 응용 프로그램이 항상 실행되도록 보장합니다. 하지만 스크립트는 탄력적이므로 애플리케이션이 실행 중이 아니고 잘못 응답하는 것 같지 않으면 나중에 다시 시도합니다.

SIGTERM예를 들어 또는 로 인해 기본 스크립트가 종료되면 이 루프도 중지되기를 SIGINT원합니다 . while기본 스크립트가 종료된 후에도 애플리케이션을 계속 실행할 필요가 없습니다.

쉘 스크립트에서 이를 수행하는 일반적인 방법은 무엇입니까? 제가 원하는 것은 두 가지입니다.

  1. 애플리케이션 재실행 방지
  2. 현재 실행 중인 애플리케이션 인스턴스를 가능한 한 빨리 중지하세요.

쉘 스크립트에서 이 작업을 수행하는 방법을 모르겠습니다. INTand를 캡처할 수 있지만 루프에 논리를 삽입하는 방법 과 애플리케이션을 중지하는 방법을 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고려해야 할 유사한 작업을 처리하는 다른 명령이 있습니다 .

관련 정보