![원자적으로 파일을 생성하고 복사하는 좋은 전략은 무엇입니까?](https://linux55.com/image/55251/%EC%9B%90%EC%9E%90%EC%A0%81%EC%9C%BC%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%83%9D%EC%84%B1%ED%95%98%EA%B3%A0%20%EB%B3%B5%EC%82%AC%ED%95%98%EB%8A%94%20%EC%A2%8B%EC%9D%80%20%EC%A0%84%EB%9E%B5%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
myfile
주기적으로 재생성해야 하는 파일이 있습니다. 재생성에는 몇 초 정도 걸립니다. 반면에 생성된 마지막(또는 두 번째에서 마지막까지) 파일을 주기적으로 읽어야 합니다. 완전히 생성된 파일을 읽고 있고 읽기 시작하면 완전히 읽을 수 있음을 보장하는 가장 좋은 방법은 무엇입니까?
한 가지 가능한 해결책은
myfile
실제로 마지막으로 생성된 파일에 대한 소프트 링크입니다myfile.last
.- 재생성은 새 파일에서 수행됩니다.
myfile.new
- 재생성 후
myfile.new
이전되었습니다 .myfile.last
내가 본 질문(답을 알 수 없음)은 다음과 같습니다. myfile
mv가 발생하는 동안 다른 스크립트가 복사되는 경우 cp
올바르게 수행된 것입니까?
또 다른 가능한 해결책은 이름에 타임스탬프가 있는 파일을 생성하는 것입니다. 예를 들어 myfile-2014-09-03_12:34
, 이는 마지막으로 myfile
생성된 파일에 대한 소프트 링크입니다. 이 링크는 생성 후 새 파일을 가리키도록 변경되어야 합니다. 다시 말하지만, 이와 같은 일이 일어날 가능성은 얼마나 됩니까?
cp myfile anotherfile
손상된 파일을 복사하시겠습니까?
답변1
동일한 파일 시스템 내에서 이동하는 경우 mv
이는 원자적입니다. 콘텐츠의 복사본이 아니라 이름만 바꾸는 것입니다. 따라서 귀하 세대의 마지막 단계는 다음과 같습니다.
mv myfile.new myfile.last
읽기 과정에서는 항상 파일의 이전 버전이나 새 버전이 표시되며 불완전한 내용은 전혀 표시되지 않습니다.
답변2
첫 번째 제안 솔루션을 단순화할 수 있습니다. 파일을 myfile.new
로 다시 빌드한 mv
다음 이름을 myfile
.
당신이라면 어떨까요?씌우다 myfile
새 데이터의 경우 비동기 판독기가 손상된(또는 적어도 불완전한) 데이터를 얻을 수 있지만 이미 알고 있습니다. 나는 당신이 생각해낸 어떤 해결책도 안전하다고 확신합니다. 다른 프로세스가 12시 38분에 파일의 12시 34분 버전을 열면 해당 파일은 계속해서그 파일12:39 버전의 파일은 myfile
더 이상 어떤 디렉토리에도 나타나지 않더라도 이름이 변경된 후 읽을 수 있도록 열립니다. 두 번째 경우에는 12:39 파일을 가리키도록 심볼릭 링크를 변경한 후에도 12:34 버전이 디렉터리에 남아 있기 때문에 이는 더욱 명확합니다.