2011-08-14 4 views
16

다음 잠금 메커니즘이 동시에 실행에서 cron 일을 방지하기 위해 사용됩니다,bash는 무리 : 출구 취득 할 수없는 경우 잠금

#!/bin/bash 

echo "Before critical section" 
(
    flock -e 200 
    echo "In critical section" 
    sleep 5 
) 200>/tmp/blah.lockfile 
echo "After critical section" 

두 개의 인스턴스를 실행, 나중에 대기를 처음 완료 될 때까지 다음 실행됩니다. 이로 인해 실행 대기중인 스크립트의 백 로그가 발생할 수 있습니다.

flock이 잠금을 획득 할 수 없으면이 스크립트를 어떻게 변경하여 스크립트를 종료합니까? 나는 성공하지 못한 채 -n을 시도했다.

답변

20
flock -n -e 200 || exit 1 

flock -n은 실패 코드 (0 이외의 값)를 반환하여 실패했다고 알립니다. 선택하지 않은 오류가 발생하면 스크립트 상단에서 set -e을 종료하여 종료 할 수 있습니다.

응용 프로그램에 따라 잠금을 얻을 수 없을 때 성공을 나타내는 exit 0을 표시 할 수 있습니다.

12

스크립트 파일 자체에 단독 잠금을 사용하고 $0은 명령 파일의 이름입니다.

exec 200<$0 
flock -n 200 || exit 1 

전체 솔루션은 두 줄의 코드로되어 있습니다. 그러나 트릭은 $ 0을 읽고 독서를 위해 배타적 잠금을 얻는 것입니다.

+2

이것이 실패 할 수있는 경우를 문서화하는 것이 좋습니다. 나는'$ 0'이 공백을 포함한다면 실패 할 것으로 의심하고'$ 0'이 실행중인 스크립트의 경로를 포함하지 않으면 실패 할 것이다. (예를 들어 스크립트는 다른 곳에 있지만'PATH'에있다.) – joeytwiddle

+0

$ PATH에 $ 0이 있으면 경로가 있어야합니다. 작동하지 않는 경우는 대시 (dash)입니다. – steveayre