gzip은 원 자성입니까?


11

gzip원자?

gzip파일을 압축하는 도중 프로세스를 중지하면 어떻게됩니까 ?

원자 적이 지 않고 gzip *.txt프로세스에서 Ctrl + C를 이미 누른 경우 안전하게 다시 시작하려면 어떻게해야합니까?

(저는 재개하는 방법뿐만 아니라 gzip구체적으로 원자 적인지 궁금합니다 .)



4
_... 사용 "? 어떻게 안전하게 재개 않는다" CTRL+Z대신을 CTRL+C죽이고 다음, 또는이 숫자로 응답 (중단 된 작업을 다시 시작 n[- [n]+ Stopped-- gzip ...] 다음에 다시 시작할 수 있습니다 %n또는 함께 fg, 또는에 bg... 같은 방법으로 kill %n)로 죽일 수 있습니다 .
Hastur

압축하는 동안 파일 인 Ctrl-C를 압축하여 어떤 일이 발생하는지 확인하십시오.
RonJohn

아니요. ext4… sarcasm dripping을 제외하고는 mv 만 원 자성입니다. 그러나 적어도 그들은 얼마 전에 기본 마운트 옵션을 수정했습니다.
mirabilos

답변:


28

gzip은 원 자성입니까?

아니요. 압축 파일을 만든 다음 압축되지 않은 원본을 제거합니다.

특히, 파일 을 제자리에서 압축하지 않으며 파일이 압축되는 동안 일정 시간이 있습니다.

  • 압축 된 대상이 불완전하다
  • 부분적으로 압축 된 파일과 그 소스는 모두 파일 시스템에 존재합니다.

파일을 gzipping하는 동안 gzip 프로세스를 중지하면 어떻게됩니까?

gzip캐치 가능한 신호 ( 예 : SIGINTfrom)로 프로세스 를 중지하면 Ctrl C부분적으로 생성 된 파일이 정리됩니다. 그렇지 않으면 중지 된 지점에 따라 수정되지 않은 원본과 함께 부분적으로 압축 된 파일이 생길 수 있습니다.

원자가 아닌 경우 이미 gzip * .txt 프로세스에서 Ctrl + C를 누르면 어떻게 안전하게 다시 시작할 수 있습니까?

부분 압축 버전 (아직 존재하는 경우)을 삭제하고를 다시 시작하십시오 gzip.


5
제 2 프로세스가 공급되었을 때 종료 가 안 때, 정지 , 단지 비 처리 신호를 발생하는 (하지 않는 ^ C -> SIGINT또는 SIGTERM하는 gzip출력 파일을 제거하는 신호 처리기를 설치).
mosvy

1
@mosvy 그래서 그렇게합니다. 나는 전에 그것을 본 적이 없다. 감사합니다
roaima

1
원본이 삭제 된 동안 gzip 파일을 삭제하지 않도록 각별히주의하십시오. gzip이 불규칙적으로 종료되면 일반적으로 하나의 파일, 일반적으로 마지막 파일입니다.
하퍼-복원 모니카

@ 하퍼 예. gzip중간 흐름 을 멈 추면 항상 작은 경쟁 조건이 있습니다. 또는 gzip대부분의 정리 문제를 회피하는 대상 파일을 덮어 쓰 도록 항상 지시 할 수 있습니다.
roaima

15

(유닉스 파일 시스템 API 정말 여러 파일에 영향을 원자 작업을 수행 할 수있는 방법을 제공하지 않습니다) 그것은 원자 아니지만, 그것은 이다 페일 세이프 (fail-safe). 압축 파일은 새 파일이며 원본을 덮어 쓰지 않으며 압축 파일 작성이 완료 될 때까지 원본 파일을 삭제하지 않습니다 (디스크 공간이 충분하지 않으면 실제로 문제가 발생할 수 있음) 두 파일).

오류가 발생하거나 압축을 중단하면 원본 파일은 변경되지 않습니다. 부분 압축 파일은 일반적으로 제거됩니다.

중간에 다시 시작할 수있는 방법이 없습니다. 처음부터 다시 시작하면됩니다.


이를 통해 원자 다중 파일 작업을 구현할 수있는 방법에 대해 생각하게됩니다. SQL 트랜잭션과 같은 것이 있습니까?
발은 모니 티 복원 모니카

1
@val 약 30 년 전에 저는 새로운 OS를 Multics / GCOS 후속으로 디자인하는 팀에 있었고 데이터베이스와 같은 파일 시스템이 아이디어의 일부였습니다. 그러나 프로젝트는 결코 멀지 않았습니다.
Barmar

그들은 NTFS 트랜잭션을 제거했지만 합병증의 가치가없는 것 같습니다. 이름 바꾸기는 동일한 파일 시스템에 있고 posix 의미가있는 한 가장 원자적인 작업이므로 temp에서 최종 이름으로 이름을 바꾸면 (닫기 / fsync 후) 압축되지 않은 파일이 최소한 완성됩니다. 파이프를 사용할 때 이러한 문제를 해결할 수 있습니다 (자체 부분 고장 모드가 있음)
eckes

@eckes 압축 파일을 닫은 후 원본을 삭제하면 원자 이름을 바꿀 필요가 없습니다. 원본이 사라지면 압축 파일이 완료되었는지 확인할 수 있습니다. 원본 파일을 대체하는 작업 (예 :)의 경우 원자 이름을 바꾸어야합니다 sed -i.
Barmar

@Barmar 대상 파일 (많은 디렉토리 폴링 워크 플로우)의 존재만으로 트리거하려는 경우 파일이 완전한지 확인하는 것이 좋습니다. 당신이 그것을 트리거하지 않거나 소스 존재를 확인하여 불완전한 파일을 감지 할 수 있다면 최종 이름을 바꾸지 않아도됩니다.
eckes

4

gzip.gz파일을 작성 하고 압축 된 컨텐츠로 파일을 채우고 원본 파일을 삭제 하므로 걱정할 필요가 없습니다 . 따라서 중간에 프로세스를 중지해도 원본 파일에는 영향을 미치지 않습니다.


3

.txt이미 성공적으로 처리 된 파일 gzip.txt.gz압축 파일 로 대체되어 안전하게 gzip *.txt다시 실행할 수 있습니다 . 아직 처리되지 않은 파일 만 압축됩니다.

Ctrl-C를 눌렀을 때 gzip으로 처리되고 있던 파일은 수정되지 않습니다. gzip은 압축이 완료 될 때까지 파일 대체하지 않습니다 .


0

아니요, 매우 원자 적이 지 않습니다. 웹 로그와 같이 때때로 추가되는 파일을 압축하면 큰 문제가 발생할 수 있습니다.

Gzip은 .gz 파일 (현재 타임 스탬프 포함)을 읽고 원본 파일의 타임 스탬프를 복사 한 다음 원본을 삭제합니다.

특정 중단으로 인해 .txt.gz파일 바로 옆에 길고 완료되지 않은 파일 이 남을 수 .txt있습니다. 그러면 데이터 무결성 문제가 발생합니다. 실제 파일은 무엇입니까? 이거

  • 불완전한 / 손상된 상태로 남겨둔 gzip .txt.gz? 또는
  • 불완전한 / 잘린 .txt파일을 남겨둔 실패한 주포 ? 또는
  • 파일을 성공적으로 gzip으로 압축 txt.gz하고, 새로 생성 된 .txt 파일?

(이것은 HTTP 로그 디렉토리로 이동하여을 갈 때 발생합니다 gzip *.)

나는 당신이 방금했기 때문에 무슨 일이 일어 났는지 정확히 알지 못한다면 일반적으로 이것을 손으로 분류하는 것이 현명하다고 생각합니다.

다행히도 gzip은 일반적으로 직렬로 작동하므로 하나의 파일에서만이 문제가 발생합니다. gzip을 병렬화하는 것은 좋은 생각이 아닙니다. CPU를 더 많이 사용하더라도 디스크가 여러 파일을 한 번에 읽도록 ​​강요하여 모든 gzip을 크게 느리게합니다. 반면에 SSD 또는 RAMdisk는 ...


1
@roaima. 우리는 실제로, 내가 일했던 한 곳에서 오래 전에 사용했던 속어에 의지하고있었습니다. 공통 정의로 수정합니다.
하퍼-복원 모니카

1
당신이 downvote하려고하는 경우 이유를 설명하는 의견을 남겨주세요.
JBentley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.