bash의 파일에서 원자 쓰기 작업 수행


13

배쉬를 통과 한 후 문서 , 질문 나에게 아직 확실하지 않다 사람은 어떻게 bash는 파일에 원자 쓰기 (추가) 작업을 수행 할 수 있습니다. 여러 인스턴스에서 실행되는 스크립트가 있으며 어느 시점에서 파일에 데이터를 써야합니다.

echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE

동시에 실행중인 모든 스크립트에서 해당 파일 원자로 모든 쓰기 작업을 수행하는 방법 (한 인스턴스의 데이터가 다른 인스턴스의 데이터와 겹치지 않도록)하는 방법은 무엇입니까?


1
참고로 필요하지 않습니다 `pwd`. 점 ( .) 만 사용할 수 있습니다 . 또한 변수가 포함되어 있기 때문에 전체 파일 이름을 인용해야 합니다 .
와일드 카드

1
FIFO 사용 가능성을 조사 할 수도 있습니다 .
와일드 카드

@ 와일드 카드 감사합니다. 내가 사용하고 pwd현재 작업 디렉토리에 대해 사용자에게 통지하고 또한 로그 파일에 항목을 작성하는 이전 스크립트입니다. FIFO를 살펴 보았습니다.
Sebi

1
실제로 바로이 사이트에 FIFO에 대한 더 나은 소개가 있습니다. 몇 분 전에 제공 한 링크는 POSIX 사양 mkfifo이며 정확한 소개 수준은 아닙니다.
와일드 카드

파일이 FIFO이든 파일이든 관계없이 두 인스턴스가 동시에 쓰고 서로의 출력을 왜곡 할 위험이 있습니다.
clacke

답변:


10

flockman ( http://linux.die.net/man/1/flock ) 의 예제와 같이 사용해야 할 것 같습니다.

(
flock -x 200

# Put here your commands that must do some writes atomically

) 200>/var/lock/mylockfile 

그리고 원자 적이어야하는 모든 명령을 ()에 넣으십시오.


비록 쓰기 작업은 원자 적 일 것입니다 (flock -s 200 # 원자 적으로 쓰기를 수행 해야하는 명령을 여기에 넣으십시오) 200> / var / lock / mylockfile은 동시에 실행되는 여러 스크립트에 걸쳐 읽혀 집니까? 또는 반대로 잠금은 / var / lock / mylockfile과 관련이 있습니까?
Sebi

1
스크립트는 / var / lock / mylockfile을 잠그지 만 한 스크립트 인스턴스 만 쓰기 잠금을 얻을 수 있습니다. 다른 인스턴스는 /var/lock/mylockfile잠금을 사용할 수 있을 때까지 기다립니다 .

-s는 공유 잠금-읽기에 적합하며 쓰기 잠금의 경우 -x / -e를 사용해야합니다. 링크 한 매뉴얼 페이지에 있습니다.
Evan Benn

이 코드에서 어떤 시점에서 잠금 해제가 발생합니까? /var/lock/mylockfile호출 한 프로세스에 의해 무언가가 쓰여지 자마자 flock -x?
Chris Stryczynski

@ChrisStryczynski이 예제 (flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile를 두 개의 셸에서 실행할 수 있으며 ()의 모든 명령이 실행 된 후에 만 ​​(잠금 해제) 잠금 해제가 발생 함을 알 수 있습니다.

4

flock연동 작업 방법 중 하나입니다. 이 유틸리티는 util-linux 툴셋의 일부이며 Linux에서만 사용할 수 있습니다. 광범위한 플랫폼에서 사용할 수있는 다른 유틸리티 setlock는 그의 daemontools 패키지에서 Daniel J. Bernstein의 유틸리티를 기반으로 합니다.

  • setlock daemontools에서
  • setlock Bruce Guenter의 daemontools-encore에서
  • s6-setlock Laurent Bercot의 s6에서
  • chpst Gerrit Pape의 runit에서
  • runlock 웨인 마샬의 퍼프에서
  • setlock 내 nosh 툴셋에서

이 도구는 M. Kurenkov의 답변 ( flock사용할 수는 있지만 그 답변에는없는)에 사용 된 것과 약간 다른 패러다임으로 작동합니다 . 하나는 setlock프로그램을 호출하여 로드 해야하는 명령에 로드연결 합니다. setlock자체는 잠금 파일을 열고 잠그고 파일 디스크립터는 프로세스에서 열린 상태로 둡니다. 잠금은 프로세스가 수행하는 동안 지속됩니다 (열린 파일 설명자를 찾아서 닫아서 잠금을 명시 적으로 해제하도록 후속 명령이 연결되어 있지 않는 한).

문제의 경우 출력 라인을 생성하는 명령을 연동하여 쉘 내장 명령 대신 외부 echo 를 호출한다는 것을 알고 있어야합니다 echo.

setlock mylockfile echo "$ RESULT">> ./$TEMP_DIR/$OUT_FILE

이 경우 추가 모드에서 출력 파일을 열어서 인터록 할 필요는 없습니다. 그렇다면 잠금 내에서 해당 파일을 열어야 할 것이므로 fdredir/ 와 같은 프로그램을 사용해야합니다 redirfd.

setlock mylockfile fdredir --1 추가 "./$TEMP_DIR/$OUT_FILE"에코 "$ RESULT"
원하는 경우 쉘 함수로 전환 할 수 있습니다.

outfile () {setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; } 
[…]
아웃 파일 에코 "$ RESULT"
또는 쉘 구문을 고수하고 인터록에서 실행되는 두 번째 쉘에 의해 해석되며, 쉘 변수가 환경 변수로 내보내지지 않은 경우 사소한 인용이 필요합니다.

setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '

이것은 물론 출력 파일에 쓰는 것 이외의 것을 일반화합니다.

setlock mylockfile sh -c '… 연동; 물건… '

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.