在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的数据?
发布于 2023-01-15 23:30:43
如果写入应用程序本身不会创建一个新文件,并且如果它找不到要写入的文件,那么它要写入的数据将丢失,则需要确保在此期间不存在该文件。一个可能的解决方案是使用硬链接模拟原子"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()系统调用。当该syscall用于替换另一个文件时,没有一个应用程序不能按其名称open()文件的时间段。试图打开它的进程将看到它与它的旧inode或它的新inode。如果它通过其旧的inode访问它(即rename()尚未返回),那么它将打开备份文件。如果它通过新的inode访问它,它将打开新创建的空文件。
https://unix.stackexchange.com/questions/731889
复制相似问题