lsyncd – 單向同步,但針對整個文件夾
我有兩個文件夾
~/A
和~/B
. 有一些內容。我寫了一個
lsyncd
配置文件~/.config/lsyncd/lsyncd.conf
:# NOTE: Use only absolute path names # NOTE: check "man rsync" for parameters inside "rsync{}". # Global settings settings { logfile = "/home/ziga/.config/lsyncd/lsyncd.log", statusFile = "/home/ziga/.config/lsyncd/lsyncd-status.log", statusInterval = 5 } # Synchronisation A ⟶ B sync { default.rsync, source = "/home/ziga/A", target = "/home/ziga/B", delete = true, rsync = { binary = "/usr/bin/rsync", executability = true, existing = false, } }
我
lsyncd
是這樣開始的:lsyncd -nodaemon ~/.config/lsyncd/lsyncd.conf
**注意:**參數
-nodemon
只是為了在我執行上述命令的終端中為我提供更多資訊。執行命令後立即進行同步並將文件夾的內容
~/A
傳輸到文件夾~/B
。這沒關係。根據我的配置文件,我希望如果我刪除一個文件
~/B
,它不會被刪除~/A
,情況也是如此!這是一種通緝行為 - 我想防止意外刪除文件夾中的內容~/A
。但是在這一點上,我也希望它
lsyncd
會檢測到該文件夾~/B
缺少一個剛剛刪除的文件,並將通過將失去的文件從復製~/A
到~/B
它在啟動時立即執行的方式再次同步文件夾!但這不會發生。如何才能做到這一點?
實際上,您有兩個問題可能應該分開處理。我們先來看看第二個,因為它更容易回答:
但在這一點上,我也希望 lsyncd 會檢測到文件夾 ~/B 缺少剛剛刪除的文件,並將通過將失去的文件從 ~/A 複製到 ~/B 再次同步文件夾,就像它在啟動時立即執行的那樣!
使用您的配置,當在target刪除文件時,您不能期望立即做出反應。
lsyncd
用於inotify
監視源文件樹中的更改。實際上,在啟動時發生的初始同步之後,它不知道目標發生了什麼。相反,它不時(見下文)呼叫rsync
以將源樹中的更改反映到目標。理論上,只要目標是本地的,就可以通過以及
lsyncd
監視目標。但通常情況並非如此。假設目標位於遠端主機上(與您的範例相反)。那麼如何通知遠端目標中的文件被刪除?inotify``lsyncd
不過,這不是問題:下一次
lsyncd
開始新的同步(通過執行rsync
),將再次創建文件。也就是說,雖然對目標上正在刪除的文件沒有立即反應,但該文件將在下一次rsync
執行中再次複製。下一次執行發生在原始碼樹(見下文)或啟動rsync
時發生一定數量的更改之後。請注意,您可以通過 配置
lsyncd
執行同步的頻率rsync
。據我了解,有一個預設超時,但另外,如果lsyncd
注意到源樹(通過inotify
)中有 1000 個(預設值)更改,那麼(無論超時如何)它都會執行rsync
以一次同步所有這些更改。rsync
當然,這比在每次更改後執行要好得多。所以,來到你的最後一個問題(“如何做到這一點”),它根本無法完成,或者需要一些程式。在每種情況下,您都必須執行一個守護程序來監視目標上的文件系統更改,然後自行執行
rsync
以將文件從源同步到目標,或者在發生此類更改時通知源上的另一個守護程序依次執行rsync
。但是你就不需要
lsyncd
更多了,因為有了這些知識,你可能會建構自己的雙向同步系統。現在讓我們解決您的第一個問題:
根據我的配置文件,我希望如果我刪除 ~/B 中的文件,它不會從 ~/A 中刪除,情況也是如此!
我無法立即說出這裡出了什麼問題;考慮到您的配置,它真的不應該發生。但是,我有一個關於進一步分析的建議:
啟動時
lsyncd
,添加參數-log Exec
。然後您的命令行將顯示為:lsyncd -log Exec -nodaemon ~/.config/lsyncd/lsyncd.conf
這將記錄所有程序產生的命令行
lsyncd
(在你的情況下,到終端)。我非常有信心,當您發布這些命令行時,我們可以確定問題(最好是作為原始問題的更新);它們應該顯示如何rsync
執行,包括命令行參數。也許我可以幫助分析,但說實話,我不是那麼深入rsync
。