gunzip 是原子的吗?

gunzip 是原子的吗?

我有两个监视目录的脚本(postgres warm-standby)

一个脚本将压缩文件复制到目录中,然后解压缩它们。

另一个脚本监视未压缩的文件,然后将它们导入到postgres中。

我想知道我是否可以遇到这种情况:摄取脚本在写入 gunzip 的输出时可以读取它的输出?

简而言之:gunzip

  1. 解压然后改名
  2. 解压后复制到新名称
  3. 其他东西

答案1

它是非原子的,正如您在大规模压缩期间执行 ls 时所看到的那样:

dfranke@alatar:~$ dd if=/dev/zero of=bigfile bs=1M count=3072
3072+0 records in
3072+0 records out
3221225472 bytes (3.2 GB) copied, 39.1106 s, 82.4 MB/s
dfranke@alatar:~$ gzip bigfile &
[1] 19876
dfranke@alatar:~$ ls -l bigfile*
-rw-r--r-- 1 dfranke staff 3221225472 2010-11-08 17:16 bigfile
-rw------- 1 dfranke staff     114688 2010-11-08 17:18 bigfile.gz
dfranke@alatar:~$ ls -l bigfile*
-rw-r--r-- 1 dfranke staff 3221225472 2010-11-08 17:16 bigfile
-rw------- 1 dfranke staff     212992 2010-11-08 17:18 bigfile.gz

答案2

假设某个特定实用程序(例如gunzip)的工作方式来判断脚本的正​​确性可能不是一个好主意,因为实用程序的内部行为在后续版本中可能会发生变化。相反,我建议您使用适当的锁定方法(由您的特定操作系统提供)来确保互斥。大多数 Linux 发行版都提供flock在 shell 脚本中的使用。

相关内容