2010-05-24 5 views
2

두 개의 다른 코드 인스턴스가 두 번 이상 실행되지 않도록 파일 잠금에 bash 명령 인 flock을 사용하고 있습니다.잠금을 얻지 못한 경우 bash의 flock이 시간 초과 종료로 종료되지 않는 이유는 무엇입니까?

나는이 테스트 코드를 사용하고 있습니다 :

((flock -x 200 ; sleep 10 ; echo "original finished" ;) 200>./test.lock) & 
(sleep 2 ; (flock -x -w 2 200 ; echo "a finished") 200>./test.lock) & 

을 나는 (백그라운드로)이 개 서브 쉘을 실행하고 있습니다. (flock NUM; ...) NUM>FILE 구문은 flock's man page입니다.

첫 번째 서브 셸은 test.lock에 대한 독점적 잠금을 얻고 10 초를 기다린 다음 "원래 완료 됨"을 인쇄하고 항상 잠금을 유지할 것으로 기대합니다. 두 번째 서브 쉘은 거의 같은 시간에 시작하여 2 초를 기다린 다음 test.lock에 잠금을 설정하려고 시도하지만 2 초 후에 시간 초과됩니다. 자물쇠가 생기면 "완료"라고 인쇄합니다. 잠금을 얻지 못하면 그 서브 쉘이 멈추고 아무 것도 출력되지 않아야합니다.

첫 번째 서브 셸이 더 오래 대기하기 때문에 10 초 동안 잠금을 유지하므로 두 번째 하위 셸은 잠금을 가져 오지 않아야합니다. 즉, "원본 마무리 됨"이 인쇄되고 이 아닌 것이 모두입니다.

실제로 "완성 된"이 인쇄되면 "원본 완료 됨"이 인쇄됩니다.

이것은 두 번째 하위 셸이 (a) 첫 번째 하위 셸과 동일한 잠금을 사용하지 않거나 (b) 잠금을 얻지 못했지만 실행을 계속한다는 점 또는 (c) 다른 것을 의미합니다.

내가 원하는대로 잠금 장치가 작동하지 않는 이유는 무엇입니까?

+1

'flock'은 배시 명령이 아닙니다. 그것은 별도의 프로그램입니다. –

답변

5

문제가 flock 프로세스가 제한 시간 내에서 잠금을 얻기 위해 실패 할 경우, 그것은 부모 프로세스 (를 양산 즉 쉘)를 죽이는 방법이 없다,이다 - 그것은 할 수있는 모든 실패 리턴 코드를 반환 할 것입니다 . 계속하기 전에 반환 코드를 확인해야합니다

flock <params> && <do other stuff> 

그렇게

((flock -x 200 ; sleep 10 ; echo "original finished" ;) 200>./test.lock) & (sleep 2 ; (flock -x -w 2 200 && echo "a finished") 200>./test.lock) & 

당신이 원하는 않습니다.

+0

200> 파일 이름을 수행 할 수있는 구문은 무엇입니까? 200은 fd #입니까? – user37078

+0

@ user37078 : 예, "> filename"은 "표준 출력 (fd # 1)을 'filename'으로 리다이렉트 함"을 의미합니다. "; "200> filename"은 "fd # 200을 'filename'으로 리다이렉트 함을 의미합니다." – psmears