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

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

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

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



답변

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연동 작업 방법 중 하나입니다. 이 유틸리티는 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 '… 연동; 물건… '


답변