원자 적 업데이트를 위해 파일에 대한 독점적 인 읽기 / 쓰기 잠금 확보 A가이 파일을 잠글 수 있습니까? 살펴 보았지만

카운터로 사용되는 파일을 갖고 싶습니다. 사용자 A는이 숫자를 쓰고 증가시키는 반면 사용자 B는 파일을 읽도록 요청합니다. 사용자 A의 쓰기가 완료 될 때까지 아무도 파일을 읽거나 쓸 수 없도록 사용자 A가이 파일을 잠글 수 있습니까?

살펴 보았지만 flock예상대로 작동하지 않는 것 같습니다.

flock -x -w 5 /dev/shm/counter.txt echo "4" >  /dev/shm/counter.txt && sleep 5

이 원자와 같은 증분 파일을 얻는 더 적절한 방법이 있다면 듣기에도 좋을 것입니다!

내 목표는 :

LOCK counter.txt; write to counter.txt;

동시에

Read counter.txt; realize it's locked so wait until that lock is finished.


답변

Bash의 아래 명령 처리는 놀랍습니다.

flock -x -w 5 /dev/shm/counter.txt echo "4" >  /dev/shm/counter.txt && sleep 5

Bash가 먼저 실행 flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt되고 성공적으로 완료되면 (잠금 해제) 실행됩니다 sleep 5. 따라서 5 초 동안 잠금이 유지되지 않습니다.

옆에 &따로&&

하나는 두 개의 명령이있는 경우 AB다음을 :

  1. A & B시작 A백그라운드에서 다음 시작 B을 기다리지 않고 A끝까지.

  2. A && B시작 A하고 완료 될 때까지 기다린 다음 성공적으로 완료되면 (종료 코드 0) 시작합니다 B. 경우 A(제로가 아닌 종료 코드) 실패 후 B실행되지 않습니다.

요컨대, &그리고 &&두 개의 완전히 다른 목록 사업자이다.


답변

파일 잠금은 필수 1 이 아닙니다. 즉, 다른 프로세스 액세스 할 수 없도록 파일을 잠글 수 없습니다 . 파일을 잠그면 (다른) 프로세스 파일 이 잠겨 있는지 확인 하면 알게됩니다.

목적은 flock원하는 것과 같은 작업을 수행하는 것이지만 시도한 모든 액세스에 사용해야 flock합니다 . 통화를 차단하고 있음을 명심하십시오. 부터 man flock:

잠금을 즉시 획득 할 수없는 경우 잠금은 잠금이 사용 가능할 때까지 기다립니다.


1. 보안과 같은 기능을 사용하는 경우이 기능이 쓸모없는 것처럼 보이지만 파일 잠금의 목적은 아닙니다. 동기화를위한 것입니다. Leo 사용자 는 다른 * nix 운영 체제와의 역사적 유사성을 기반으로 Linux 커널에 표준화되지 않은 필수 파일 잠금 구현이있을 수 있다고 지적했습니다 ( 이 설명 참조 ). 그러나 이것은 C 레벨 인터페이스로만 보입니다.


답변

“sh -c command …”를 사용하여 잠금을 유지 한 상태에서 파일 경로 재 지정을 포함한 전체 쉘 명령을 실행할 수 있습니다. 또한 파일을 카운터로 사용하기 때문에 읽기 및 쓰기를 수행하는 동안 잠금을 계속 유지해야합니다. 따라서 카운터를 늘리고 새로운 값을 반환하기 위해 이와 같은 작업을 수행하려고합니다.

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'read count < /dev/shm/counter.txt ; echo $((count + 1)) > /dev/shm/counter.txt ; echo $((count + 1))'

더하기 기호를 빼기 기호로 변경하면 카운터가 감소합니다.

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'read count < /dev/shm/counter.txt ; echo $((count - 1)) > /dev/shm/counter.txt ; echo $((count - 1))'

경합이 발생하기 전에 카운터를 초기화 할 것으로 예상되므로 조기에 잠그는 것에 대해 걱정할 필요가 없습니다.

echo 0 > /dev/shm/counter.txt

경합이 발생할 수 있지만 카운터 값을 클로버해야한다고 생각하지는 않지만 그렇게 할 경우 다음과 같이해야합니다.

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'echo 0 > /dev/shm/counter.txt'

나는 당신이 읽는 방법을 이해한다고 생각하지만, 나는 그것을 완전성을 위해 포함시킵니다.

flock --shared /dev/shm/counter.txt cat /dev/shm/counter.txt