누군가 파일 및 디스크립터를 사용하여 파일을 잠그고 잠긴 파일에 쓰는 방법을 설명 할 수 있습니까?


14

내가 flock도구를 처음 접했을 때 나와 함께 드러나며 내가 아는 한 파일 설명자를 사용하지 않았습니다.

cURL 요청을하고이라는 파일에 출력을 쓰는 bash 스크립트가 resp.txt있습니다. 해당 파일에 쓸 수 있고 스크립트를 실행하고 동시에 텍스트 파일을 편집하는 여러 사용자에 대해 걱정할 수 없도록 독점 잠금을 만들어야합니다.

다음은 파일을 잠그고 요청을 수행하고 텍스트 파일에 쓸 것으로 예상되는 코드입니다.

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

이것이 올바른 방법입니까? 내 실제 스크립트는 이것보다 약간 길지만 flockbash 스크립트에 구문을 추가하면 깨지는 것 같습니다 .

누군가이 파일 설명자가 어떻게 작동하는지 설명하고 파일을 올바르게 잠그고 있는지 알려면 멋질 것입니다!

답변:


8

이 작업을 수행 할 때 독점 잠금을 얻기 전에( flock -e 200; ... ) 200> file 파일을 자르기 때문에 이것은 올바르지 않습니다 . 나는 당신이해야한다고 생각합니다 :file

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

읽기 전용으로 열린 파일에 잠금을 설정합니다.

노트. 일부 쉘은 9보다 큰 파일 디스크립터를 지원하지 않습니다. 또한 하드 코드 된 파일 디스크립터가 이미 사용되었을 수 있습니다. 고급 셸 (bash, ksh93, zsh)을 사용하면 다음을 수행 할 수 있습니다.

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)

curl 명령이 파일에 쓸 필요가 있습니다. 어떻게 flock작동 하는지 오해하고 있습니까? 나는 파일 디스크립터를
처음 접했다

1
@DuckPuncher 잠금 메커니즘은 파일에서 수행 할 수있는 읽기 / 쓰기 작업과 별개입니다. 따라서 curl여전히 파일에 쓸 수 있습니다. NFS에서는 안전하지 않거나 작동하지 않을 수도 있지만 NFS를 통한 파일 잠금에는 셸 스크립트를 사용하지 마십시오. 을 사용하면 bash파일을 읽고 쓸 수 있도록 파일을 열 수도 있습니다. 200<> resp.txt그러나 아무 것도 변경해서는 안됩니다.
vinc17
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.