파일의 공통 잠금 장치의 레이스 조건?
문제
이것은 파일 시스템을 사용하여 잠금을 생성하는 표준 접근법입니다. 예를 들어, Visudo는 다음을 사용합니다.
[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock
1) 혼란 스러워요. 레이스 조건이 있기 때문에 Linux는 사용합니다.
2) 쉘에서 파일을 잠그는 더 좋은 방법이 있습니까?
3) 아니면 대신 디렉토리를 사용해야합니까?
발견 된 해결책 : Man Lockfile.
해결책
예, 실제로 샘플 스크립트에는 레이스 조건이 있습니다. 레이스의 경우 실패를 얻으려면 Bash의 Noclobber 옵션을 사용하여 테스트와 터치 사이에 다른 스크립트가 몰래 들어가는 경우에 실패 할 수 있습니다.
설명되어 있습니다 여기. 나는 몇 개의 주석 (bk에 의해 접두사 :) :
이에 대한 가능한 해결책은 기존 파일로 리디렉션되지 않는 IO 리디렉션 및 Bash의 Noclobber 모드를 사용하는 것입니다. 우리는 다음과 비슷한 것을 사용할 수 있습니다.
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
# BK: this will cause the lock file to be deleted in case of other exit
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
# critical-section BK: (the protected bit)
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Failed to acquire lockfile: $lockfile."
echo "Held by $(cat $lockfile)"
fi
다른 팁
Flock Command 시도 :
exec 200>"$LOCK_FILE"
flock -e -n 200 || exit 1
잠금 파일이 잠겨 있으면 종료됩니다. 그것은 원자이며 최근 버전의 NFS에서 작동합니다.
나는 시험을했다. 0이있는 카운터 파일을 만들었고 두 서버의 루프에서 다음을 동시에 500 번 실행했습니다.
#!/bin/bash
exec 200>/nfs/mount/testlock
flock -e 200
NO=`cat /nfs/mount/counter`
echo "$NO"
let NO=NO+1
echo "$NO" > /nfs/mount/counter
한 노드는 잠금을 위해 다른 노드와 싸우고있었습니다. 두 실행이 완료되면 파일 내용은 1000이었다. 나는 여러 번 시도했고 항상 작동한다!
참고 : NFS 클라이언트는 RHEL 5.2이고 사용 된 서버는 NetApp입니다.
더 쉬운 솔루션을 찾은 것 같습니다 : Man Lockfile