gzip: 예기치 않은 파일 끝 - 파일 읽는 방법

gzip: 예기치 않은 파일 끝 - 파일 읽는 방법

나는 매우 오랜 시간 동안 실행되고 많은 출력을 생성하는 배치 시스템에서 작업합니다. 배치 노드가 작업 영역을 가득 채우고 이어서 충돌하는 것을 방지하려면 실제로 gzip을 통해 stdout을 파이프해야 합니다.

longscript | gzip -9 > log.gz

이제 작업이 계속 실행되는 동안 출력을 조사하고 싶습니다. 그래서 저는 이렇게 합니다:

gunzip log.gz

대용량 파일(수 GB)이기 때문에 실행하는데 시간이 오래 걸립니다. 출력 파일이 런타임에 생성되는 것을 볼 수 있고 빌드 타임에 볼 수 있습니다.

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file

그러나 결국 gzip은 gzip 압축 파일의 끝을 만나게 됩니다. 이는 작업이 계속 실행 중이고 gzip이 여전히 파일에 쓰고 있기 때문에 발생하므로 아직 올바른 바닥글이 없습니다.

gzip: log.gz: unexpected end of file

그 후에는 추출된 로그 파일이 삭제됩니다. gzip은 손상된 추출 데이터가 나에게 쓸모가 없다고 간주하기 때문입니다. 그러나 나는 이에 동의하지 않습니다. 마지막 몇 줄이 뒤섞여 있더라도 출력은 여전히 ​​매우 흥미로울 것입니다.

"손상된" 파일을 유지하도록 gzip을 어떻게 설득할 수 있나요?

답변1

파일의 마지막 부분 외에도 zcat(또는 gzip -dc, 또는 )를 사용하여 gunzip -c압축되지 않은 데이터를 볼 수 있습니다.

zcat log.gz | tail

또는

zcat log.gz | less

또는

zless log.gz

gzip버퍼링은 분명한 이유로 발생합니다(데이터를 청크로 압축해야 함). 따라서 프로그램이 일부 데이터를 출력하더라도 해당 데이터가 아직 파일에 없을 수 있습니다 log.gz.

압축되지 않은 로그를 다음과 같이 저장할 수도 있습니다.

zcat log.gz > log

...하지만 그건 어리석은 일입니다. 애초에 출력을 압축해야 할 이유가 분명히 있기 때문입니다.

답변2

tail -f내가 올바르게 이해했다면 계속 성장하는 gzip 파일로 다음과 같은 작업을 수행 하고 싶을 것입니다 .격자 도구이는 다음을 수행합니다(무엇보다도):

$ gztool -T log.gz

그리고 계속해서 콘솔에 출력되어 필요할 때 새 데이터를 기다립니다.

gzip으로 압축된 데이터에 대한 향후 tail 또는 기타 임의 액세스를 거의 즉각적으로 수행할 수 있는 gztool인덱스 파일도 생성됩니다( log.gzi이 경우) . gztool인덱스를 생성하고 싶지 않은 경우(0.3%/gzip 크기이고 처리 시간이 늘어나지 않더라도) -W인덱스 없음을 사용할 수 있습니다.

답변3

파일을 분할하고 gzip으로 압축해 볼 수 있습니다.https://stackoverflow.com/a/2016918/3090950

어쨌든, 자세한 정보 표시 모드에서 명령을 실행할 수 있나요? 그러면 더 많은 정보가 제공됩니다.

관련 정보