2012-09-26 37 views
0

我試圖寫一塊,在那裏我試圖做$ {文件}和$ {}文件。新型cp命令不應該失敗

原代碼這樣之間的文件交換 -

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}的那一刻,如果有一個進程正在讀取,那麼副本可能會失敗,並說它無法獲取對象的鎖定。

我對失敗的恐懼是否真正成立?

我想告訴程序等待幾秒/分鐘,然後重試,而不是失敗。

我在AIX 6.1上使用korn shell。

回答

0

我不知道你的系統,但我說cp -f將刪除該文件,如果它不能立即覆蓋它。 (也有自動備份文件的選項,但請查看您系統的手冊。)

+0

我不能承擔在覆蓋之前刪除文件......在這種情況下,它會使目前鎖定文件的進程失敗。 – Gyan

1

看看你是否可以爲你工作。使「文件」成爲另外兩個文件file1和file2的符號鏈接。使用命令「ln -fs file1 file」來創建這個鏈接。當有人打開「文件」時,操作系統會將您重定向到「file1」當您希望創建備份時,運行命令「ln -fs file2 file」,現在文件將指向file2。然後你可以在file1上做任何你想做的事情。反轉過程返回到file1。

1

可以使用硬鏈接做備份的部分:

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

ln後,就會有舊文件中的兩個文件名。在mv之後,只有.backup文件名將引用舊文件,${File}將引用新文件。