나는 매우 오랫동안 실행되고 엄청난 양의 출력을 생성하는 배치 시스템에 대한 작업을 수행하고 있습니다. 실제로는 배치 노드가 작업 영역을 채우고 이어서 충돌하는 것을 방지하기 위해 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
어쨌든, 자세한 정보 표시 모드에서 명령을 실행할 수 있나요? 그러면 더 많은 정보가 제공됩니다.