2013-05-11 17 views
2

我有一個在OSX上運行的bash腳本。
它需要操縱網絡共享上的某些文件(Synology NAS上的AFP共享)。OSX上的Bash:如何確定網絡文件(AFP)是否正在使用?

不幸的是,這些文件有時仍然在腳本運行時寫入。

如何確定文件是否正在使用?

正常的方法是使用「lsof」,但如果其他用戶來自局域網上的另一個客戶端,那麼這似乎不適用於網絡文件。

我只能嘗試重命名該文件。我想如果這個文件正在使用,那將會失敗,但這遠遠不夠優雅。

有人有更好的解決方案嗎?

+0

在[Apple討論](https://discussions.apple.com/thread/3252589?start=0&tstart=0)線程幫助中做什麼? – summea 2013-05-11 17:01:03

+0

和關於併發訪問網絡共享文件的討論一般http://serverfault.com/questions/61086/concurrent-nfs-access – 2013-05-11 17:04:23

+0

@summea該線程從託管共享的服務器的角度討論事情。我在客戶端。 – Tonny 2013-05-11 18:44:28

回答

3

這不是一個可以解決的問題。典型的解決方案是將文件寫入臨時位置,然後將其移至最終處理目錄(因爲在文件系統中移動通常是原子的)。如果你無法控制文件的寫入方式或位置,那麼你就會得到啓發式的信息,特別是像查看文件和查看文件是否在「一段時間內」增長的情況,但是與分離文件相比,這些文件都不是特別好來自排隊的寫作。

+0

我已經得出了自己的結論。剛剛張貼在這裏,看看我是否錯過了一些東西,但顯然不是。所以我會嘗試先重命名文件(如你所說的原子操作),然後使用重命名的文件。額外的好處是,在重命名我可以擺脫文件名中的空格。使腳本的其餘部分變得更加容易。將是一個帶空格的引用噩夢。 – Tonny 2013-05-12 09:27:49

+0

空格遠離文件名中唯一危險的字符。你必須在腳本中做適當的引用。沒有繞過它。 – 2013-05-12 19:20:20

+0

@KenThomases我知道。相信我我知道...幸運的是,所有文件的起源都是Windows或OSX。所以最危險的東西已經不被操作系統所允許。如果確實發生了什麼,它會導致重命名,從而導致錯誤處理將被捕獲,並跳過該文件。這對於這個已經足夠了。腳本所做的日誌文件將由操作員檢查,並且他/她可以手動處理問題案例。 – Tonny 2013-05-13 18:26:04

1

其他潛在的訪問是由任意程序完成,還是可以假定它是由其他客戶端上運行的程序的其他實例完成的?

如果該文件對您的程序是私有的,那麼您的程序的所有實例都可以參與協作鎖定方案。例如,您可以使用lockfile命令。即使面對信號/例外情況,也要確保清理鎖定文件。您可以使用trap內置命令來提供幫助。有關說明,請參見here

+0

我希望我能。文件通過各種上傳方式(ftp,scp,rsync)創建。我的腳本需要讀取它們一次以將它們轉換爲另一種格式,然後(如果轉換成功)將原始文件移動到存檔位置。如果文件只有一個讀鎖定,轉換將會成功(沒有給出錯誤),但如果文件尚未完全上傳,輸出將被破壞(因此無用),並且我無法檢測到該情況。 – Tonny 2013-05-12 09:24:35

相關問題