我在批处理系统上有一份工作,该系统运行时间非常长并产生大量输出。实际上,我必须通过 gzip 管道传输标准输出,以防止批处理节点填充其工作区并随后崩溃。
longscript | gzip -9 > log.gz
Run Code Online (Sandbox Code Playgroud)
现在,我想在作业仍在运行时调查作业的输出。所以我这样做:
gunzip log.gz
Run Code Online (Sandbox Code Playgroud)
这运行时间很长,因为它是一个巨大的文件(几 GB)。我可以在运行时看到正在创建的输出文件,并且可以在构建时查看它。
tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file
Run Code Online (Sandbox Code Playgroud)
但是,最终 gzip 遇到了 gzip 压缩文件的结尾。由于作业仍在运行并且 gzip 仍在写入文件,因此还没有合适的页脚,所以会发生这种情况:
gzip: log.gz: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
在此之后,提取的日志文件被删除,因为 gzip 认为损坏的提取数据对我没有用。然而,我不同意——即使最后几行被打乱了,输出对我来说仍然非常有趣。
如何说服 gzip 让我保留“损坏”的文件?
Kus*_*nda 10
除了文件的最后,您还可以使用zcat
(或gzip -dc
、 或gunzip -c
)查看未压缩的数据:
zcat log.gz | tail
Run Code Online (Sandbox Code Playgroud)
或者
zcat log.gz | less
Run Code Online (Sandbox Code Playgroud)
或者
zless log.gz
Run Code Online (Sandbox Code Playgroud)
gzip
出于明显的原因(它需要以块的形式压缩数据)将进行缓冲,因此即使程序可能已经输出了一些数据,该数据可能还没有在log.gz
文件中。
您还可以存储未压缩的日志
zcat log.gz > log
Run Code Online (Sandbox Code Playgroud)
...但这会很愚蠢,因为显然你首先压缩输出是有原因的。
归档时间: |
|
查看次数: |
68359 次 |
最近记录: |