원자 적 업데이트를 위해 파일에 대한 독점적 인 읽기 / 쓰기 잠금 확보


10

카운터로 사용되는 파일을 갖고 싶습니다. 사용자 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.

1
"예상대로 작동하지 않는 것 같습니다." 구체적으로 무엇 을 의미합니까?
John1024

나는 그것을 잘못 사용하고 있다고 확신하지만, 위의 코드를 사용하는 동안 두 개의 셸을 사용할 수 있으며 하나가 잠겨 있다고 생각하면서 카운터 파일을 편집하도록 할 수 있습니다. 나는 두 개의 별도의 껍질에 두 배 줄을 실행 그렇다면, (에코에 자신의 번호와 함께), 난 여전히 두 번째 숫자가 기록되는 참조
D를 -_- b를

1
첫 번째가 잠금을 완료하고 해제하면 두 번째가 실행됩니다. 그것이 작동하는 방식이 아닙니까? (위의 코드에서, 무리가 잠금을 해제 한 후에&& sleep 5 실행 됩니다.)
John1024

흠 .... 그렇다면 인간의 눈을 사로 잡기에는 너무 빨 랐을 것입니다. 큰! 다음 과제는에 여러 명령을 넣는 방법 flock이지만 별도의 질문으로하겠습니다. 고마워 존!
d -_- b

3
@d -_- b 사용자 이름이 마음에 듭니다. 그것은 내가 본 것 중 가장 영리한 사용자 이름입니다.
Devyn Collier Johnson

답변:


10

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실행되지 않습니다.

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


3
의 경우는 나를 놀라게 것 A && B, A기다릴 것 B마무리합니다.
Andras Gyomrey

1
A && B에서 A가 먼저 실행됩니다. B는 A가 성공적으로 실행되고 종료 된 경우에만 실행됩니다. A를 사용하십시오. B는 A의 실행 상태에 관계없이 항상 B를 실행합니다.
kapad

15

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

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

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


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


감사! 이것은 '권고'측면과 flock매번 어떻게 사용해야하는지 이해하는 데 도움이됩니다 . 매우 도움이되었습니다!
d -_- b

2

"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

이것은 질문에서 무리가 실행 되기 전에 쉘에 의해 파일이
열린다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.