원자적으로 파일을 생성하고 복사하는 좋은 전략은 무엇입니까?

원자적으로 파일을 생성하고 복사하는 좋은 전략은 무엇입니까?

myfile주기적으로 재생성해야 하는 파일이 있습니다. 재생성에는 몇 초 정도 걸립니다. 반면에 생성된 마지막(또는 두 번째에서 마지막까지) 파일을 주기적으로 읽어야 합니다. 완전히 생성된 파일을 읽고 있고 읽기 시작하면 완전히 읽을 수 있음을 보장하는 가장 좋은 방법은 무엇입니까?

한 가지 가능한 해결책은

  1. myfile실제로 마지막으로 생성된 파일에 대한 소프트 링크입니다 myfile.last.
  2. 재생성은 새 파일에서 수행됩니다.myfile.new
  3. 재생성 후 myfile.new이전되었습니다 .myfile.last

내가 본 질문(답을 알 수 없음)은 다음과 같습니다. myfilemv가 발생하는 동안 다른 스크립트가 복사되는 경우 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 버전이 디렉터리에 남아 있기 때문에 이는 더욱 명확합니다.

관련 정보