카운터로 사용되는 파일을 갖고 싶습니다. 사용자 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 초 동안 잠금이 유지되지 않습니다.
옆에 &
따로&&
하나는 두 개의 명령이있는 경우 A
및 B
다음을 :
-
A & B
시작A
백그라운드에서 다음 시작B
을 기다리지 않고A
끝까지. -
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