你爲什麼不只是有某種(使用cron的,說的)進行同步你的自動化過程?
您可以通過cron作業監視「Drop box」目錄(或多個目錄),然後它可以運行腳本爲您執行復制。
或者您可以讓用戶使用某些元數據提交文件,以便在文件上傳後更好地路由文件。
簡單地說,不要讓用戶「選擇」它去哪裏,而是讓他們告訴你「它是爲了什麼」,然後讓你知道事情發生的地方以及如何讓它們到達那裏。
這是一個相當直接的web應用程序,即使只是一些perl CGI或其他。後端管道也很簡單。
接聽評論...
如果你有一個Web應用程序進行上傳到CGI,那麼你通常不會連得後才文件已完全上傳請求的「控制」。這種取決於你使用的服務器端技術。無論如何,當文件完全上傳時,用Web應用程序很容易「知道」。然後,您的同步過程可以完全依靠元數據來實際完成文件的工作,並且直到將文件移動到適當的臨時區域之後才能創建元數據。
如果您只是使用FTP或scp將文件複製到暫存目錄中,那麼解決方案有兩個有兩個進程。第一個監視傳入目錄,第二個實際上覆制文件。
第一個過程可以簡單地是這樣的:
cd /your/upload/dir
ls -l > /tmp/newfiles
comm -12 /tmp/lastfiles /tmp/newfiles > /tmp/samefiles
filelist=`awk '{print $9}' /tmp/samefiles`
mv $filelist /your/copy/dir
mv /tmp/newfiles /tmp/lastfiles
這是這樣的:
- 抓鬥在 傳入上傳目錄當前的文件列表。
- 使用 comm(1)可以獲得 自上次運行 以來未更改的文件。
- 使用awk(1)獲取 未更改的文件名。
- 使用mv(1) 將文件移動到您的「分段」 目錄。
- 最後,它需要 當前的文件列表,並使其成爲下一次運行的最後一個列表 。
這裏的魔法是comm(1)。 'comm -12 filea fileb'爲您提供一個文件,其中包含兩個文件之間相同的行。如果有新文件進入,那麼它的大小會隨着上傳而改變,所以當你下一分鐘運行'ls -l'時,它的行將與新行不匹配 - 大小(最小)將會不同。所以,通訊只會發現誰的日期,文件名和大小沒有改變的文件。一旦你有了這個列表,其餘的都很簡單。
這個過程的唯一假設就是你的文件名沒有空格(awk很容易從列表中獲取文件名)。如果你允許空格,你需要一個更聰明的機制來將'ls -l'行轉換爲文件名。另外,'mv $ filelist/your/copy/dir'假定文件名中沒有空格,所以它也需要修改(你可以將它捲入awk腳本,讓它成爲一個系統()調用,也許)。
第二種方法也很簡單:
cd /your/copy/dir
for i in *
do
sync $i
mv $i /your/file/youve/copied/dir
done
同樣,「在文件名中的假設沒有空格」在這裏。這個過程依賴於你寫過的正確的事情的同步shell腳本。這留給了讀者一個練習。
一旦同步,它將文件移動到另一個目錄。任何顯示在那裏的文件都已正確「同步」。你也可以簡單地刪除文件,但我往往不這樣做。我會把這個目錄放在「刪除超過一週的文件」程序上。這樣,如果遇到問題,您仍然可以將原始文件放置在可以恢復的位置。
這東西很簡單,但它也很健壯。
只要第一個進程的運行速度比上傳速度「慢」(即,如果您連續運行兩次,則確信文件大小至少會發生變化),那麼運行時間可以是每1分鐘,每小時,每天,不管。至少,它可以安全地重新啓動,並自我恢復。
第二個過程的陰暗面在於,如果您的同步過程花費的時間比您的日程安排cron更長。如果您每分鐘運行一次,並且運行需要一分鐘以上,則會有兩個進程複製相同的文件。
如果你的同步過程是「安全」的,你最終只會將文件複製兩次......浪費,但通常是無害的。
您可以通過使用像this這樣的技術來減輕這種情況,以確保您的副本腳本一次不會運行多個腳本。
這就是它的肉。您還可以使用組合(使用Web應用程序上傳元數據,並使用通過cron自動運行的同步過程)。
您還可以通過一個簡單的網頁列出/ your/copy/dir中的所有文件,以便大家可以查看它們的文件是否已同步。如果該文件位於該目錄中,它尚未完成同步。
這是一個有趣的方法,我能看到的唯一問題是,如果有一些自動運行的自動cron,那麼它可能會嘗試同步文件,當他們只上傳一半。 需要某種標誌,也許元數據文件必須在主文件之後上傳。我想主題是'上傳大....',但我可能需要一些如何處理刪除文件。 – Wizzard 2009-08-29 10:29:20