我正在尝试写一篇文章,我试图在$ {File}和$ {File}之间进行文件交换.new
原始代码是这样的 -
generate ${File}.new
mv ${File} ${File}.backup
mv ${File}.new ${File}
在某些情况下失败了,当第一个mv完成的同一时刻,但是第二个mv还没有完成,可以请求$ {File}。并且该请求被拒绝,因为该文件不可用该名称。虽然发生很少,但仍然发生(昨天发生在6周内的第一次)
为了避免这种情况,我想到用mv
替换cp
因此,我正在尝试构建这样的东西 -
generate ${File}.new
cp ${File} ${File}.backup
cp ${File}.new ${File}
rm ${File}.new
现在,我的挑战是,在我写入$ {File}的那一刻,如果有一个进程在那个时刻读取,那么副本可能会失败,说它无法获取对象的锁定
我对失败的恐惧是真的吗?
我想告诉程序等待几秒钟/分钟,然后再试一次,而不是失败。
我在带有korn shell的AIX 6.1上。
答案 0 :(得分:1)
看看你是否可以让它为你工作。使“file”成为另外两个文件file1和file2的符号链接。使用命令“ln -fs file1 file”创建此链接。当有人打开“文件”时,操作系统会将您重定向到“file1”当您希望创建备份时,运行命令“ln -fs file2 file”,现在文件将指向file2。然后,您可以在file1上执行任何操作。将进程反转回file1。
答案 1 :(得分:1)
您可以使用硬链接来执行备份部分:
generate ${File}.new
ln -f ${File} ${File}.backup
mv ${File}.new ${File}
在ln
之后,旧文件将有两个文件名。在mv
之后,只有.backup
文件名将引用旧文件,${File}
将引用新文件。
答案 2 :(得分:0)
我不知道您的系统,但我的cp -f
如果无法立即覆盖该文件,则会删除该文件。 (还有自动备份文件的选项,但请查看系统手册。)