我有两个监视目录的脚本(postgres warm-standby)
一个脚本将压缩文件复制到目录中,然后解压缩它们。
另一个脚本监视未压缩的文件,然后将它们导入到postgres中。
我想知道我是否可以遇到这种情况:摄取脚本在写入 gunzip 的输出时可以读取它的输出?
简而言之:gunzip
- 解压然后改名
- 解压后复制到新名称
- 其他东西
答案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 脚本中的使用。