bash에서 flock & exec는 안전합니까?


13

내가 본 "표준"잠금 스 니펫은 다음과 같습니다.

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

exec그 시점에서 사용하는 것이 안전합니까 (테스트가 그렇게 말하는 것 같 습니까)? 서브 프로세스가 잠금을 유지합니까?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

나는 실행중인 프로세스가 열린 파일 설명자를 유지한다는 것을 모호하게 기억하고 무리는 파일 설명자를 사용하기 때문에 작동해야합니다. 그러나 나는 그것을 명확하고 명확하게 만드는 문서를 찾을 수 없습니다.

레코드의 경우 이는 Linux에만 해당됩니다.

답변:


3

예, 잠금은에 걸쳐 유지 exec됩니다. execve파일 디스크립터가 열려 있는 한 기본 시스템 호출 에서 잠금이 유지 됩니다. 파일 디스크립터는 execveexec에서 닫히도록 구성되지 않은 한 계속 열려 있으며 쉘 재 지정으로 작성된 파일 디스크립터는 close-on-exec로 표시되지 않습니다.


6

그렇습니다. Exec은 프로세스 이미지를 대체하지만 여전히 동일한 프로세스이므로 이와 관련된 OS 수준 잠금은 동일하게 유지됩니다.

작동하는지 확인하는 것은 매우 쉽습니다.

자물쇠

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

스크립트

sleep 100

./lock다음 100 초 내에 두 번 실행 해보십시오 . 잠금을 한 번만 받으면 ergo exec는 잠금을 해제하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.