2012-04-15 52 views
6

我有一個視頻編碼腳本,我希望在文件移入特定目錄後立即運行該腳本。將文件移動到另一個目錄完成傳輸

如果我使用類似inotify的東西,我如何確保文件在編碼移動之前不被編碼?

我認爲做這樣的事情:

  • 副本(rsync的)文件到一個臨時目錄。
  • 完成後,將(簡單'mv')移動到編碼目錄中。
  • 讓我的腳本監視編碼目錄。

但是,如何讓步驟2正常工作並且只有在#1完成後才運行?

我使用的是Ubuntu Server 11.10,我想使用bash,但如果這可以簡化問題,我可以說服他們使用Python。

我不是「下載」文件到這個目錄,本身;相反,我會在絕大多數時間使用rsync。

此外,此Ubuntu服務器運行在虛擬機上。

我的主要文件存儲通過NFS從FreeBSD服務器上掛載。

回答

1

我使用的一種技術與FTP一起工作。您向FTP服務器發出命令以將文件傳輸到輔助目錄。命令完成後,您會向服務器發送第二條命令,這次告訴它將文件從aux目錄重命名爲最終的目標目錄。如果您正在使用inotify或輪詢目錄,則文件名將不會顯示直到重命名完成,因此,您可以保證文件完整。

我不熟悉rsync,所以我不知道它是否具有類似的重命名功能。

+0

rsync以同樣的方式工作 - 文件不會顯示在要編碼的文件列表中,直到完成傳輸。 – javanix 2012-05-03 14:27:58

2

最簡單的方法是使用像wgetcurl這樣的程序進行下載,該程序在文件完成下載之前不會退出。如果做不到這一點,我不知道這是否是絕對的最佳解決方案,但你可以使用一個腳本,循環,檢查使用lsofgrep文件是否打開:

while lsof | grep /path/to/download >/dev/null; do sleep 5; done 
mv /path/to/download /path/to/encode/dir 
+0

這應該在一個捏,但我想盡量避免投票。 – javanix 2012-04-16 13:59:44

0

inotifywait看起來很有希望。您必須小心謹慎,因爲如果下載在通知設置之前完成,它將永遠等待。

inotifywait -e close_write "$download_file" 
mv "$download_file" "$new_location" 
相關問題