Bash

Bash 腳本:監控 hotfolder 和部分文件

  • February 24, 2013

我有一個通過 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 伺服器和客戶端都不會與您一起參與,您可以執行類似的操作

  1. 創建文件和文件大小的列表。
  2. 將此列表與之前的文件列表進行比較
  3. 處理目前列表中與前一個列表中的文件相同的文件
  4. 將目前文件列表保存在前一個列表之上
  5. 等待 5 分鐘,然後返回 1。

5 分鐘內沒有變大的文件可能已經完成了。這樣做bash留給讀者作為練習。

引用自:https://serverfault.com/questions/481982