如何“移动”进程当前正在写入的文件(bash、复制、截断)

如何“移动”进程当前正在写入的文件(bash、复制、截断)

在 BASH 中自动旋转文件以防止偶尔写入该文件时发生数据丢失的最佳方法是什么?

例如,我想这样做,但我认为由于目标文件不存在的命令之间的时间,可能会发生数据丢失

mv foo.bar foo.bar-$(date "+%Y%m%d_%H%M%S")
touch foo.bar
chown user1:user1 foo.bar
chmod 0600 foo.bar

改进上述 BASH 命令以使写入文件的数据不会丢失或损坏的最佳方法是什么foo.bar

答案1

如果写入应用程序不会自行创建新文件,并且如果找不到要写入的文件,则要写入的数据将会丢失,则需要确保文件不存在任何时间段不存在。一种可能的解决方案是使用硬链接来模拟原子“a->b 和 b->c”重命名。这可以通过如下方式完成:

ln foo.bar foo.bar-$(date "+%Y%m%d_%H%M%S")
touch foo.bar.new
mv foo.bar.new foo.bar

重命名之前链接之间发生的任何写入都将镜像到备份文件。

这是可行的,因为在可能的情况下mv使用rename()系统调用。当该系统调用用于替换另一个文件时,应用程序在任何时候都无法open()通过文件名来访问该文件。尝试打开它的进程将看到它的旧索引节点或新索引节点。如果它通过旧的索引节点访问它(即rename()尚未返回),那么它将打开备份文件。如果它通过新的索引节点访问它,它将打开新创建的空文件。

相关内容