gzip: 예상치 못한 파일 끝 - 어쨌든 파일을 읽는 방법

gzip: 예상치 못한 파일 끝 - 어쨌든 파일을 읽는 방법

나는 매우 오랫동안 실행되고 엄청난 양의 출력을 생성하는 배치 시스템에 대한 작업을 수행하고 있습니다. 실제로는 배치 노드가 작업 영역을 채우고 이어서 충돌하는 것을 방지하기 위해 gzip을 통해 표준 출력을 파이프해야 합니다.

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이를 수행할 수 있는 방법은 다음과 같습니다.

$ gztool -T log.gz

그리고 필요할 때 새로운 데이터를 기다리면서 지속적으로 콘솔에 출력됩니다.

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

답변3

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

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

관련 정보