내가 본 "표준" 잠금 조각은 다음과 같습니다.
(
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
, 파일 설명자가 열려 있는 한. 파일 설명자는 execve
exec 시 닫히도록 구성되지 않는 한 열린 상태로 유지되며, 쉘 리디렉션으로 생성된 파일 설명자는 close-on-exec로 표시되지 않습니다.