是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...