문제

이것은 파일 시스템을 사용하여 잠금을 생성하는 표준 접근법입니다. 예를 들어, 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입니다.

스크립트 잠금 (병렬 실행에 비해)

http://wiki.bash-hackers.org/howto/mutex

참고로.

더 쉬운 솔루션을 찾은 것 같습니다 : Man Lockfile

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top