스크립트가 실행 중인지 확인하고 인스턴스가 완료될 때까지 일시 중지하여 다시 실행하려면 어떻게 해야 합니까?

스크립트가 실행 중인지 확인하고 인스턴스가 완료될 때까지 일시 중지하여 다시 실행하려면 어떻게 해야 합니까?

그래서 우리는 이 스크립트를 실행하고, 파일에 데이터를 추가하고, 스크립트가 이미 실행 중인지 확인하기 위해 뭔가를 추가해 보았습니다. 그렇다면 일시 중지하고 20초 후에 다시 확인하여 실행되지 않는 것을 발견할 때까지 작업을 반복하고 싶습니다. 이 시점에서 나머지 스크립트를 계속 실행하고 싶습니다. 그래서 계속할 수 있을 때까지 계속 확인하는 방법을 알아야 합니다. 누구든지 아이디어가 있나요?

    if [ `ps -ef| grep $script_name_with_arguments | wc -l ` -gt 1 ]
    then
      echo "already running"
      sleep 20s
    else
      echo "ok"
    fi
}```

답변1

어떤 종류의 자물쇠를 사용합니다.

가장 쉬운 방법은 파일을 잠그는 것입니다. 이를 관리하는 패키지가 있습니다. 플랫폼이나 배포판이 무엇인지 말하지 않았기 때문에 정확할 수는 없지만 그 중 하나가 프로그램 procmail과 함께 제공되는 패키지 입니다 lockfile.

다음과 같은 스크립트에서 사용할 수 있습니다.

LOCK=/run/npaulsen/mylockfile.lock
lockfile -20 $LOCK
run_the_fscking_rest_of_my_script
rm -f $LOCK

하나의 인스턴스가 충돌하는 경우 무한정 멈추는 것을 방지하기 위해 몇 가지 개선 사항을 적용할 수 있습니다. 이에 대한 맨페이지를 읽을 수 있습니다: man 1 lockfile. 또는 직접 구현할 수도 있습니다. 쉽지만 실제 프로그래밍 언어(셸 스크립트가 아님)가 필요합니다.

또 다른 더 정교한(그러나 더 복잡한) 아이디어는 POSIX 세마포어를 사용하는 것입니다 man 7 sem_overview.

관련 정보