![gzip: 예기치 않은 파일 끝 - 파일 읽는 방법](https://linux55.com/image/109535/gzip%3A%20%EC%98%88%EA%B8%B0%EC%B9%98%20%EC%95%8A%EC%9D%80%20%ED%8C%8C%EC%9D%BC%20%EB%81%9D%20-%20%ED%8C%8C%EC%9D%BC%20%EC%9D%BD%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 매우 오랜 시간 동안 실행되고 많은 출력을 생성하는 배치 시스템에서 작업합니다. 배치 노드가 작업 영역을 가득 채우고 이어서 충돌하는 것을 방지하려면 실제로 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
어쨌든, 자세한 정보 표시 모드에서 명령을 실행할 수 있나요? 그러면 더 많은 정보가 제공됩니다.