첨부 중인 파일을 이동해도 안전한가요?

첨부 중인 파일을 이동해도 안전한가요?

fs.appendFile에 행을 추가하는 node.js 프로세스가 있습니다 . 예를 들어 및 2개의 호출 대신에 file.log각각 약 40자의 전체 행을 추가합니다 . 이 파일을 다음 위치로 옮기면 줄이 손실되거나 부분적으로 복사되지 않도록 할 수 있나요?fs.appendFile("start-end")fs.appendFile("start-")fs.appendFile("end")file2.log

답변1

파일 시스템 경계를 넘어 파일을 이동하지 않는 한 작업은 안전합니다. 이는 "이동"이 실제로 수행되는 방식인 역학 때문입니다.

파일이 동일한 파일 시스템에 있는 경우 mv파일은 실제로 건드리지 않고 파일 시스템 항목만 변경됩니다.

$ mv foo bar

실제로는 다음과 같은 작업을 수행합니다.

$ ln foo bar
$ rm foo

이렇게 하면딱딱한파일(실제로 파일 시스템 항목이 가리키는 inode)에 대한 링크(두 번째 디렉토리 항목)의 foo이름이 지정되고 bar항목 foo이 삭제됩니다. 이제 삭제 시 inode를 foo가리키는 두 번째 파일 시스템 항목이 있으므로 foo이전 항목을 삭제해도 foo실제로 해당 inode에 속한 블록은 삭제되지 않습니다.

열린 파일 핸들이 파일 시스템 항목이 아닌 파일의 inode를 가리키기 때문에 프로그램은 어쨌든 파일에 행복하게 추가됩니다.

노트:프로그램이 쓰기 사이에 파일을 닫았다가 다시 열면 다음과 같은 오류가 발생합니다.새로운이전 파일 시스템 항목을 사용하여 파일이 생성되었습니다!

파일 시스템 간 이동:

파일 시스템 경계를 넘어 파일을 이동하면 상황이 나빠질 수 있습니다. 이 경우 mv실제로 는 파일의 일관성이 보장되지 않습니다.

  • 대상 파일 시스템에 새 파일을 생성합니다.
  • 이전 파일의 내용을 새 파일에 복사합니다.
  • 오래된 파일 삭제

또는

$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo

각기.

$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo

응용 프로그램에 쓰는 동안 복사본이 파일 끝에 도달했는지 여부에 따라 새 파일에는 줄이 절반만 있을 수 있습니다.

또한 응용 프로그램이 이전 파일을 닫았다가 다시 열지 않으면 이전 파일이 삭제된 것처럼 보이더라도 계속해서 이전 파일에 씁니다. 커널은 어떤 파일이 열려 있는지 알고 있으며 파일 시스템 항목을 삭제하더라도 삭제됩니다. 그것 . 이전 파일의 inode 및 관련 블록은 애플리케이션이 열린 파일 핸들을 닫을 때까지 삭제되지 않습니다.

답변2

node.js를 사용한다고 하셨으니 다음을 사용하실 거라고 가정하겠습니다.fs.rename()(또는 fs.renameSync()) 파일 이름을 바꿉니다. 이 node.js 메소드는 다음을 사용하도록 문서화되어 있습니다.이름 바꾸기(2)어떤 방식으로든 파일 자체를 건드리지 않고 단순히 파일 시스템에 나열된 이름을 변경하는 시스템 호출:

"이름을 바꿔라() 파일 이름을 바꾸고 필요에 따라 디렉터리 간에 이동합니다. 파일에 대한 기타 하드 링크(다음을 사용하여 생성됨)협회(2))에는 영향을 미치지 않습니다. 열린 파일 설명자오래된 길영향을 받지도 않습니다. "

위에 인용된 마지막 문장에 특별한 주의를 기울이십시오. 열려 있는 파일 설명자(예: 프로그램이 파일에 쓰는 데 사용하는 설명)는 이름을 바꾼 후에도 계속해서 이를 가리킬 것이라고 말합니다. 따라서 파일을 쓰는 동안 파일 이름을 바꾸더라도 데이터 손실이나 손상이 발생하지 않습니다.


Andreas Weise가 쓴 것처럼그의 대답, rename(2) 시스템 호출(따라서 fs.rename()Node.js에서)은 파일 시스템 경계를 넘어 작동하지 않습니다. 따라서 이러한 방식으로 파일을 다른 파일 시스템으로 이동하려는 시도는 실패합니다.

유닉스mv명령은 오류를 감지하고 대신 내용을 새 파일에 복사하고 원본 파일을 삭제하여 파일을 이동함으로써 이 제한을 숨기려고 합니다. 안타깝게도 이와 같은 파일을 이동하는 것은하다파일을 쓰는 동안 파일을 이동하면 데이터가 손실될 위험이 있습니다. 따라서 동시에 쓸 수 있는 파일의 이름을 안전하게 바꾸려면 다음을 수행해야 합니다.아니요사용하십시오 mv(또는 적어도 새 경로와 이전 경로가 동일한 파일 시스템에 있는지 확인해야 합니다).

관련 정보