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 -T log.gz

并且会不断的输出到控制台,需要的时候等待新的数据。

请注意,gztool还将创建一个索引文件(log.gzi在本例中),该文件将使将来对 gzip 数据进行尾部或其他随机访问几乎gztool是瞬时的。如果您不想创建索引(即使它是 0.3%/gzip 大小并且不会增加处理时间),您可以使用-W不创建索引。

答案3

您可以尝试拆分文件并对其进行 gzip:https://stackoverflow.com/a/2016918/3090950

不管怎样,你能在详细模式下运行命令吗?这将为您提供更多信息。

相关内容