我有兩個資料夾~/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
再次同步資料夾,就像啟動時立即執行的那樣!但這並沒有發生。
如何才能做到這一點?
答案1
實際上,您有兩個問題可能應該分開處理。我們先看第二個,因為它比較容易回答:
但此時我還期望 lsyncd 會檢測到資料夾 ~/B 缺少剛剛刪除的文件,並透過將遺失的文件從 ~/A 複製到 ~/B 來再次同步資料夾,就像啟動時立即執行的那樣!
根據您的配置,當檔案在以下位置被刪除時,您不能指望立即做出反應:目標。lsyncd
用途inotify
觀察變化來源文件樹。實際上,在啟動時發生的初始同步之後,它不知道在開始時發生了什麼目標。相反,它會不時地調用(見下文)rsync
以反映來源樹到目標。
理論上,lsyncd
可以透過以下方式監視目標inotify
也可以透過以下方式只要目標是本地的。但通常情況並非如此。假設目標位於遠端主機上(與您的範例相反)。那麼如何才能lsyncd
收到有關文件中的通知遠端目標被刪除?
不過,這不是問題:下次lsyncd
開始新的同步(透過執行rsync
)時,將再次建立該檔案。也就是說,雖然沒有即時對目標上刪除的檔案的反應,該檔案將在下次rsync
運行中再次複製。下一次rsync
運行發生在一定數量的更改之後來源樹(見下文)或啟動時。
lsyncd
請注意,您可以透過配置運行同步的頻率rsync
。據我所知,有一個預設超時,但此外,如果lsyncd
注意到 1000(預設值)更改來源樹(通過inotify
),然後(無論超時)它運行rsync
以立即同步所有樹。當然,這比rsync
每次更改後都運行要好得多。
所以,回到你的最後一個問題(「這怎麼能做到」),根本做不到,或需要一些程式設計。在每種情況下,您都必須執行一個守護程式來監視檔案系統上的更改目標然後自行執行rsync
以同步來自來源到目標,或在發生此類變更時通知另一個守護進程來源依序運行rsync
.
但這樣您就不再需要了lsyncd
,因為有了這些知識,您可能會建立自己的雙向同步系統。
現在讓我們解決您的第一個問題:
根據我的配置文件,我希望如果我刪除 ~/B 中的文件,它不會從 ~/A 中刪除,情況也是如此!
我無法立即判斷出這裡出了什麼問題;鑑於您的配置,這確實不應該發生。不過,我對進一步分析有個建議:
啟動時lsyncd
新增參數-log Exec
。然後你的命令列將顯示:
lsyncd -log Exec -nodaemon ~/.config/lsyncd/lsyncd.conf
這將記錄所有進程產生的命令列lsyncd
(在您的情況下,記錄到終端)。我非常有信心,當您發布這些命令行時,我們可以識別問題(最好是作為原始問題的更新);它們應該顯示如何rsync
執行,包括命令列參數。也許我可以幫忙分析一下,但說實話,我的深度還不是很深rsync
。