Bash에서 무리와 실행이 안전합니까?

Bash에서 무리와 실행이 안전합니까?

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

(
    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

exec'd 프로세스가 열린 파일 설명자를 유지하고 클러스터가 파일 설명자를 사용하므로 작동해야 한다는 것을 막연하게 기억합니다. 그러나 이를 명확하고 명시적으로 설명하는 문서를 찾을 수 없습니다.

기록상 이것은 Linux에만 해당됩니다.

답변1

예. Exec은 단순히 프로세스 이미지를 교체하지만 여전히 동일한 프로세스이므로 이와 관련된 운영 체제 수준 잠금은 변경되지 않습니다.

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

잠그다

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

스크립트

sleep 100

./lock다음 100초 내에 두 번 실행 해 보세요 . 잠금은 한 번만 획득하므로 exec잠금이 해제되지 않습니다.

답변2

예, 잠금은 exec기본 시스템 호출에서 유지됩니다.execve, 파일 설명자가 열려 있는 한. 파일 설명자는 execveexec 시 닫히도록 구성되지 않는 한 열린 상태로 유지되며, 쉘 리디렉션으로 생성된 파일 설명자는 close-on-exec로 표시되지 않습니다.

관련 정보