2012-06-13 32 views
3

我的Perl腳本使用File :: Copy中的移動功能將文件移動到NFS掛載的文件系統上。最近,一些文件返回錯誤,導致我的腳本打印消息「移動返回0,路徑名中的文件或目錄不存在」。 (成功時返回1,錯誤時返回0,錯誤信息來自$!)文件::複製報告NFS寫入不正確的失敗?

真的很奇怪的是,處理文件的系統已經報告它已成功處理失敗的文件!我從來沒有見過成功寫入的錯誤消息,所以我不知道它是否與NFS有關。我認爲奇怪的是,在28個文件被移動的運行中,前24個失敗,最後4個成功。該腳本已經運行了幾個月沒有錯誤,現在已經在兩週內兩次證明了這個問題。

主機在AIX上運行,但我懷疑這是否有所作爲。

+1

嘗試使用[文件::複製::可靠(https://metacpan.org/module/File::Copy::Reliable)。 – stevenl

回答

0

我認爲這是一個NFS問題,而不是Perl。在某些情況下,NFS可能非常奇怪。

您應該統計/讀取writed文件並且不依賴於報告的錯誤。

File :: Copy :: Reliable模塊使用相同的錯誤處理它將失敗,同樣的錯誤。

形成源:

copy($source, $destination) 
    || croak("copy_reliable($source, $destination) failed: $!"); 

簡言之複製到eval塊,並嘗試讀取/ STAT在目標文件。

如果你真的很謹慎,你可以在兩個文件上使用md5/sha1 hash來確保它們是相同的。

問候,因爲在網絡上工作的補充不穩定,

+0

我認爲你對NFS是正確的。我在File :: Copy中查看了移動功能的代碼。它特別檢查「重命名是否成功返回錯誤,因爲$ to在遠程NFS文件系統上,並且NFS失去了服務器的確認?」所以現在我只需要弄清楚爲什麼代碼沒有返回成功。 – dmearns

+0

我們能夠證明沒有數據丟失,所以我們要密切關注系統。如果再次發生,我可能會最終用自己的函數替換File :: Copy :: move,並使用大量的錯誤檢查和日誌記錄。感謝大家。 – dmearns