gzip是原子的吗?


11

gzip原子的吗?

如果gzip在gzip压缩文件的过程中停止该过程,会发生什么情况?

如果它不是原子的,并且已经在gzip *.txt进程中按了Ctrl + C ,如何安全地恢复?

(我不仅对如何恢复感到好奇,而且还对是否gzip特别是原子性感到好奇。)



4
“如何安全地恢复?” _...使用CTRL+Z代替CTRL+C,然后杀死或恢复被中断的作业(它以数字n[- [n]+ Stopped-- gzip ...] 回答,然后您可以%n使用fg,或或bg...以相同的方式恢复您可以使用杀死它kill %n
哈斯图

压缩一个文件,在压缩时按Ctrl-C,然后看看会发生什么。
罗恩·约翰(RonJohn)

否。只有mv是原子的,除了ext4…讽刺性很强,但至少它们在一段时间前修复了默认的安装选项。
mirabilos

Answers:


28

gzip是原子的吗?

不会。它将创建一个压缩文件,然后删除未压缩的原始文件。

具体来说,它不会原位压缩文件并且压缩文件的一段时间内,

  • 压缩目标不完整
  • 部分压缩的文件及其源都存在于文件系统中。

如果在gzip压缩文件的过程中停止gzip进程,会发生什么情况?

如果您gzip使用可捕获的信号停止该过程(例如SIGINT来自的信号Ctrl C),它将清除部分创建的文件。否则,根据停止点的不同,最终可能会得到未压缩原始文件的部分压缩文件。

如果不是原子的,如果我已经在gzip * .txt进程上按了Ctrl + C,如何安全地恢复?

您删除部分压缩的版本(如果仍然存在),然后重新启动gzip


5
在第二情况发生时的处理终止,而不是当它停止,并且仅发生于非处理的信号(不用于^ C - > SIGINTSIGTERM用于其中gzip安装信号处理程序,其删除该输出文件)。
mosvy

1
@mosvy就是这样。我以前从未见过。谢谢
roaima '19

1
您要格外小心,以确保不会删除任何压缩文件,因为原始文件已被删除。当gzip被不定期地杀死时,通常是一个文件,通常是最后一个文件。
哈珀-恢复莫妮卡

@Harper是的。如果您停止gzip中游,那里总会出现微小的比赛情况。或者,您可以告诉gzip总是覆盖目标文件,这回避了大多数清理问题。
roaima

15

它不是原子的(Unix文件系统API并没有提供执行影响多个文件的原子操作的任何方式),但是它故障安全的。压缩文件是一个新文件,它不会覆盖原始文件,并且在完成压缩文件的创建之前也不会删除原始文件(如果您没有足够的磁盘空间来存储压缩文件,这实际上可能会引起问题两个文件)。

如果出现错误或您中断了压缩,原始文件将保持不变。通常会删除部分压缩文件。

没有办法在中间恢复它,只是从头开始。


这使我思考如何实现原子多文件操作。像SQL事务一样?
瓦尔说,请恢复莫妮卡(Monica),

1
@val大约30年前,我所在的团队正在设计一个新的操作系统,作为Multics / GCOS的后续产品,而类似数据库的文件系统是这个想法的一部分。不过,该项目从来没有走太远。
Barmar

他们删除了NTFS事务,似乎不值得这样做。重命名是最原子的操作(只要您在同一文件系统上,并且具有posix语义),因此从temp到最终名称重命名(在close / fsync之后)将确保未压缩的文件至少完整。您可以使用管道来解决这些问题(管道具有自己的部分故障模式)
eckes

@eckes只要它在关闭压缩文件后删除原始文件,就不需要原子重命名。如果原始文件不见了,您可以确定压缩文件是完整的。您需要原子重命名才能执行替换原始文件的操作(例如sed -i)。
巴马尔

@Barmar如果只想通过目标文件的存在来触发(许多目录轮询工作流都这样做),则最好确保该文件是完整的。如果您不触发此操作,或者可以通过检查源是否存在来检测不完整的文件,那么无需最终重命名就可以了。
eckes

4

您无需担心,因为gzip创建了一个新.gz文件,并使用压缩后的内容填充该文件,然后删除了原始文件。因此,如果您在中间停止该过程,则不会影响您的原始文件。


3

.txt已经成功处理的文件gzip将被.txt.gz压缩文件替换,因此您可以安全地gzip *.txt再次运行-只有尚未处理的文件将被压缩。

按下Ctrl-C时由gzip处理的文件将不会被修改-gzip 成功压缩之前不会替换它。


0

不,这是非常无原子的。如果gzip压缩偶尔添加到文件的文件(例如Web日志),这可能会给您带来很大麻烦。

Gzip读取,创建.gz文件(带有当前时间戳),复制原始文件的时间戳,然后删除原始文件。

某些中断可能会在.txt.gz文件旁边留下未完成的流浪.txt文件。然后,这会引起数据完整性问题:哪个是真实文件?这是

  • 一个gzip失败,留下一个不完整/损坏的.txt.gz?要么
  • 失败的gunzip,留下不完整/被截断的.txt文件?要么
  • 一个文件成功压缩到 txt.gz,以及一个新创建的 .txt文件?

(这最后一次发生在您进入HTTP日志目录并转到时gzip *)。

我通常认为最好还是手动进行整理,除非您确切地知道发生了什么,因为您刚刚做了。

幸运的是,gzip通常是串行运行的,因此您只应使用一个文件来解决此问题。并行gzip并不是一个好主意-尽管它会更充分地使用CPU,但它会损坏磁盘,迫使它一次读取多个文件,从而大大降低了所有gzip的速度。另一方面,SSD或RAMdisk ...


1
@roaima。我们确实做到了,我所依赖的语是我们很久以前在我工作过的地方使用的use语。更正通用定义。
哈珀-恢复莫妮卡

1
如果您要拒绝投票,请留下评论以解释原因。
JBentley '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.