0

我正在尝试写一篇文章,我正在尝试在 ${File} 和 ${File}.new 之间进行文件交换

原始代码是这样的 -

generate ${File}.new
mv ${File} ${File}.backup
mv ${File}.new ${File}

在某些情况下它失败了,当第一个 mv 完成但第二个 mv 尚未完成时,可能会请求 ${File}。并且该请求被拒绝,因为该文件不可用该名称。很少发生,但仍然发生(昨天发生,这是 6 周内的第一次)

为避免这种情况,我考虑替换mvcp,因此,我正在尝试构建这样的东西 -

generate ${File}.new
cp ${File} ${File}.backup
cp ${File}.new ${File}

rm ${File}.new

现在,我的挑战是,在我写入 ${File} 的那一刻,如果有一个进程在那个时候读取它,复制可能会失败,说它无法获得对象上的锁。

我对失败的恐惧真的有根据吗?

我想告诉程序等待几秒钟/几分钟,然后再试一次,而不是失败。

我在带有 korn shell 的 AIX 6.1 上。

4

3 回答 3

1

您可以使用硬链接来执行备份部分:

generate ${File}.new
ln -f ${File} ${File}.backup
mv ${File}.new ${File}

之后ln,旧文件将有两个文件名。之后mv,只有.backup文件名会引用旧文件,${File}才会引用新文件。

于 2012-09-28T18:49:12.233 回答
1

看看你能不能让它为你工作。使“file”成为指向另外两个文件 file1 和 file2 的符号链接。使用命令“ln -fs file1 file”来创建这个链接。当有人打开“文件”时,操作系统会将您重定向到“文件 1”。当您希望创建备份时,运行命令“ln -fs 文件 2 文件”,现在文件将指向文件 2。然后,您可以在 file1 上做任何您想做的事情。反转该过程以返回到 file1。

于 2012-09-28T16:54:19.847 回答
0

我不知道你的系统,但我说cp -f如果它不能立即覆盖它,它将删除文件。(也有自动备份文件的选项,但请查看系统手册。)

于 2012-09-26T10:54:11.750 回答