首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将当前正在写入的文件“移动”到进程(bash、复制、截断)

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

Unix & Linux用户
提问于 2023-01-15 22:46:21
回答 1查看 53关注 0票数 1

在BASH中自动旋转文件的最佳方法是防止数据丢失的可能性,如果该文件是偶尔被写到的?

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

代码语言:javascript
复制
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的数据?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-01-15 23:30:43

如果写入应用程序本身不会创建一个新文件,并且如果它找不到要写入的文件,那么它要写入的数据将丢失,则需要确保在此期间不存在该文件。一个可能的解决方案是使用硬链接模拟原子"a->b和b->c“重命名。可以这样做:

代码语言:javascript
复制
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访问它,它将打开新创建的空文件。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/731889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档