gzip 是原子的吗?

gzip 是原子的吗?

gzip原子的吗?

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

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

(我不仅好奇如何恢复,还好奇gzip具体是否是原子的。)

答案1

gzip 是原子的吗?

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

具体来说,它不压缩文件就地并且在文件被压缩的一段时间内,

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

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

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

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

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

答案2

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

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

中间没有办法恢复,只能从头开始。

答案3

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

答案4

不,这是非常非原子的。如果您对偶尔附加的文件(如网络日志)进行 gzip 压缩,这可能会给您带来大麻烦。

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

某些中断可能会在文件.txt.gz旁边留下一个杂散的、未完成的文件.txt。这就产生了数据完整性问题:哪个是真正的文件?这是

  • gzip 失败,留下不完整/损坏的文件.txt.gz?或者
  • 一个失败的gunzip,留下一个不完整/被截断的.txt文件?或者
  • 文件成功 gzip 到 txt.gz,并且新创建的 .txt文件?

(当您进入 HTTP 日志目录并转到时,最后会发生这种情况gzip *)。

我通常认为手动解决这个问题是谨慎的,除非你确切地知道发生了什么,因为你刚刚这样做了。

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

相关内容