Bash
Bash 腳本:監控 hotfolder 和部分文件
我有一個通過 FTP 上傳文件的客戶,我製作了一個腳本,主要監視 ftp 文件夾並將文件移動到生產機器上。在啟動我的命令之前,如何檢查文件是否已通過 ftp 從客戶完全傳輸,
scp
以避免傳輸部分文件?
如果您的作業系統支持它,您可以查看incrond。可以監視的事件在incrontab中定義 也許您要查找的事件是
IN_CLOSE_WRITE 為寫入而打開的文件已關閉 (*)
或與
IN_CREATE 在監視目錄中創建的文件/目錄 (*)
注意
監視目錄時,… 目錄中的文件可能會發生上述事件,在這種情況下,返回的事件數據中的名稱欄位標識目錄中文件的名稱。
如果沒有客戶的幫助,您將無法通過 bash 正確執行此操作。
在 FTP 伺服器端,一些 FTP 伺服器具有在上傳終止後執行程序的方法(它可能已經完成或客戶端可能已斷開連接,FTP 伺服器無法知道它是否真的完成了)。
要做到這一點,最好的解決方案是讓客戶端使用臨時名稱上傳文件,然後在完成後將文件重命名為正確的名稱。然後從處理中排除所有名為“whatever.tmp”的文件。否則,讓客戶端上傳一個零字節鎖定文件,上傳真實文件,然後刪除鎖定文件。然後您可以檢查鎖定文件是否存在
filelist = ... if [ -e /home/ftp/incoming/lockfile ]; then exit; fi ... process $filelist ...
如果客戶端上傳很多,那麼每次執行腳本時鎖定文件可能都在那裡,並且什麼也做不了。在這種情況下,您必鬚根據鎖定文件檢查文件的時間戳。早於 lockfile 的文件應該是完整的:
for f in ...; do if [ ! -e /home/ftp/incoming/lockfile -o $f -ot /home/ftp/incoming/lockfile ]; then ... process $f fi done
如果您的 FTP 伺服器和客戶端都不會與您一起參與,您可以執行類似的操作
- 創建文件和文件大小的列表。
- 將此列表與之前的文件列表進行比較
- 處理目前列表中與前一個列表中的文件相同的文件
- 將目前文件列表保存在前一個列表之上
- 等待 5 分鐘,然後返回 1。
5 分鐘內沒有變大的文件可能已經完成了。這樣做
bash
留給讀者作為練習。