我在一个批处理系统上工作,该系统运行时间极长并产生大量输出。实际上,我必须通过 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
不管怎样,你能在详细模式下运行命令吗?这将为您提供更多信息。