원자적인 가요 gzip
?
gzip
파일을 gzip하는 동안 프로세스를 중지하면 어떻게 되나요?
원자적이지 않고 프로세스에서 Ctrl+C를 눌렀다면 gzip *.txt
어떻게 안전하게 복구할 수 있습니까?
(어떻게 복원하는지 뿐만 아니라, gzip
구체적으로 Atomic인지도 궁금합니다.)
답변1
gzip은 원자적인가요?
습관. 압축된 파일을 생성한 다음 압축되지 않은 원본 파일을 삭제합니다.
특히 파일을 압축하지 않습니다.현장에서그리고 파일이 압축되는 일정 시간 동안,
- 압축 대상이 불완전합니다.
- 부분적으로 압축된 파일과 해당 소스가 모두 파일 시스템에 존재합니다.
gzip으로 파일을 압축하는 동안 gzip 프로세스를 중지하면 어떻게 되나요?
gzip
포착 가능한 신호(예: SIGINT
from )를 사용하여 프로세스를 중지 하면 Ctrl C부분적으로 생성된 파일이 지워집니다. 그렇지 않으면 중지한 시기에 따라 부분적으로 압축된 파일과 원본 파일이 변경되지 않은 상태로 끝날 수 있습니다.
원자적이지 않은 경우 gzip *.txt 프로세스에서 Ctrl+C를 누른 경우 어떻게 안전하게 복구할 수 있습니까?
부분적으로 압축된 버전(아직 존재하는 경우)을 삭제하고 재부팅합니다 gzip
.
답변2
원자적이지는 않지만(Unix 파일 시스템 API는 실제로 여러 파일에 영향을 미치는 원자 작업을 수행하는 방법을 제공하지 않습니다)예안전하지 않습니다. 압축 파일은 새 파일이므로 원본 파일을 덮어쓰지 않으며 압축 파일 생성이 완료될 때까지 원본 파일이 삭제되지 않습니다(두 파일 모두에 대한 디스크 공간이 충분하지 않으면 실제로 문제가 발생할 수 있습니다).
오류가 발생하거나 압축이 중단되면 원본 파일은 변경되지 않습니다. 압축 파일의 일부는 일반적으로 삭제됩니다.
중간에 복구할 수 있는 방법은 없으며 처음부터 다시 시작할 수만 있습니다.
답변3
gzip
새로운 파일이 생성되고 .gz
, 압축된 내용이 담긴 후 원본 파일이 삭제되므로 이에 대해 걱정할 필요가 없습니다 . 따라서 프로세스를 중간에 중지해도 원본 파일은 영향을 받지 않습니다.
답변4
아니요, 이것은 매우 비원자적입니다. 가끔 첨부하는 파일(예: 웹 로그)을 gzip으로 압축하면 큰 문제가 발생할 수 있습니다.
Gzip은 .gz 파일을 읽고(현재 타임스탬프 포함) 생성하고 원본 파일의 타임스탬프를 복사한 다음 원본 파일을 삭제합니다.
일부 중단으로 인해 .txt.gz
옆에 미완성 파일이 남아 있을 수 있습니다 .txt
. 이는 데이터 무결성에 대한 질문을 제기합니다. 실제 파일은 무엇입니까? 이것은
- gzip이 실패하고 파일이 불완전하거나 손상되었습니다
.txt.gz
. 또는 - gunzip이 실패하여 불완전하거나 잘린 파일이 남습니까
.txt
? 또는 - 파일이 성공적으로 gzip으로 압축
txt.gz
되었으며새로 만들어진.txt
문서?
(이것은 HTTP 로그 디렉토리로 이동하여 으로 이동하면 발생합니다 gzip *
.)
나는 일반적으로 이 문제를 방금 수행했기 때문에 무슨 일이 일어나고 있는지 정확히 알지 않는 한 수동으로 이 문제를 해결하는 것이 현명하다고 생각합니다.
다행히 gzip은 일반적으로 직렬로 실행되므로 하나의 파일에서만 이 문제가 발생해야 합니다. 병렬 gzip은 좋은 생각이 아닙니다. CPU를 더 많이 사용하기는 하지만 디스크를 파괴하여 한 번에 여러 파일을 읽게 하므로 모든 gzip 속도가 크게 느려집니다. 반면 SSD나 램디스크는...