Filesystems

如何從 SFTP 伺服器轉發新文件?

  • March 21, 2021

我有一個合作夥伴向其發送文件的 sftp 伺服器。一旦文件到達 sftp 目錄,我想讀取其內容並將內容髮送到另一台伺服器以進行進一步處理。

為了實現上述目的,我設置了一個非常瘦的文件觀察程序,該程序與 sftp 伺服器在同一台機器上執行。它使用文件系統事件觀察程序庫來訂閱 CREATE 事件 - 每當觸發此類事件時,觀察程序都會讀取文件並將其內容髮送到處理伺服器。

這在本地有效。也就是說,如果我mv從同一台機器到 sftp 目錄的文件,則內容被正確解析。但是,當我實際上put將文件從遠端機器放入 sftp 目錄時,會發生以下情況:

  1. CREATE fs 事件觸發
  2. SFTP 開始傳輸數據
  3. 文件觀察器接收 CREATE 事件,打開部分寫入的文件,將部分內容髮送到遠端處理伺服器。
  4. SFTP 完成數據傳輸。

結果,我在遠端伺服器上得到了空的內容,因為它在任何數據傳輸到它之前讀取文件。我已經驗證文件最終會收到所有數據。

SFTP put 觸發的 FS 事件序列是什麼?我應該如何解決上述案例?我正在探索簡單的延遲(一旦您收到 CREATE 事件,等待 5 秒,然後讀取文件),但似乎沒有一個是可持續的。

如果依賴inotify,你應該看CLOSE_WRITE事件而不是CREATE

如果不需要遞歸監控,可以看一下incrond(and incrontab)

或者,您可以簡單地安排rsync以較短的間隔(即:1 分鐘)執行並在下班時間清理源目錄,此時您可以停止 SFTP 服務(100% 確定在此期間沒有人上傳文件)清潔操作)。

**編輯:**好吧,您選擇的圖書館似乎提供CLOSE_WRITE事件,而只是MODIFY(見這裡)。問題MODIFY是任何寫入都會觸發單獨的事件,這意味著單個大文件上傳可以觸發未定義數量的MODIFY事件。

如果您想繼續使用通知庫,我建議您評估incrondlsyncdinotifywait

對於普通rsync方法,您當然可以結束傳輸部分上傳的文件,但是rsync在初始上傳完成後的下一個週期將完全傳輸。在接收方,您應該確保只處理完全傳輸的文件(即使使用通知方法也應該檢查這一點)。

更廣泛地說,我強烈建議您使用具有代表性的文件大小樣本進行測試,因為使用小文件進行測試可以隱藏一些影響較大文件的與時間相關的問題。

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