我有一个文件观察器脚本,它会在文件丢失或为空时发出通知。我期待的文件 - 其中一些很大。这些文件是由另一个脚本/作业从不同的路径(我无权访问)复制的。偶尔,我会收到一条错误警报,称收到的文件为空[我正在命令else
中使用条件if [ -s $file ]
],但经过检查,文件不为空。我能想到的唯一合乎逻辑的解释是在复制大文件时,unix 可能会先创建一个空文件?出于某种奇怪的巧合,我的脚本正在“那个”时间检查文件?我的脚本每十分钟在后台运行一次。
有什么办法可以防止这种情况发生吗?
答案1
如果正在复制文件,那么在打开文件进行写入但将任何文件内容刷新到磁盘之前,将会有一个非常短的时间。
复制文件以避免此类竞争条件的一种方法是将它们复制到带有临时后缀的目标目录,然后在复制完成后就地重命名:
cp "$source" "$target.tmp" &&
mv "$target.tmp" "$target"
您的接收代码将被编写为忽略这些临时文件。