cronjob每隔3小時運行一次使用SFTP下載文件。預定的程序是用Perl編寫的,使用的模塊是Net::SFTP::Foreign
。SFTP文件同時上傳和下載
能否Net::SFTP::Foreign
下載文件僅部分使用SFTP上傳?
如果是這樣,我們需要檢查修改日期,檢查複製過程完成SFTP文件?
假設一個新的文件被人在SFTP上傳和他文件上傳/複製過程中。如果同時嘗試下載,是否需要編寫只讀取文件的一部分的可能性?
cronjob每隔3小時運行一次使用SFTP下載文件。預定的程序是用Perl編寫的,使用的模塊是Net::SFTP::Foreign
。SFTP文件同時上傳和下載
能否Net::SFTP::Foreign
下載文件僅部分使用SFTP上傳?
如果是這樣,我們需要檢查修改日期,檢查複製過程完成SFTP文件?
假設一個新的文件被人在SFTP上傳和他文件上傳/複製過程中。如果同時嘗試下載,是否需要編寫只讀取文件的一部分的可能性?
這不是SFTP 客戶您使用的問題,這是無關緊要的。這就是SFTP 服務器如何處理這種情況。
一些SFTP服務器可能鎖定文件被上傳,導致您無法訪問它,而仍然被上傳它。但是大多數SFTP服務器,特別是常見的OpenSSH SFTP服務器,不會鎖定文件。
這個問題沒有通用的解決方案。檢查時間戳或大小更改可能適用於您,但它幾乎不可靠。
有一些常見的解決方法的問題:
有關詳細信息,請參閱我對SFTP file lock mechanism的回答。
您可以檢查文件的大小。
這樣做,當上傳過程也是你的操控下最簡單的方法,就是上傳使用時間名稱的文件(例如,foo-20170809.tgz.temp
),一旦上傳完成,重命名然後(Net::SFTP::Foreign::put
方法支持atomic
選項,就是這樣做)。然後在下載端,用與時態文件相對應的名稱過濾出文件。
無論如何,Net::SFTP::Foreign
get
和rget
方法可以被指示通過選項resume => 1
恢復轉移。另外,如果你有完整的SSH訪問SFTP服務器,你可以使用fuser
或類似的工具(儘管如此,請注意,即使這樣,文件可能仍然在寫入要下載的文件如果例如存在一些網絡問題並且上傳者在恢復傳輸之前需要重新連接),則不完整。