
場景:在Linux桌面上安裝IDE,在本機編輯PHP檔案。每次儲存檔案時,我都希望此變更出現在執行 Apache 的 Linux 伺服器上。伺服器有 ssh(還有 samba 和 nfs)。
作為參考,當我在 Windows 上編輯文件時,我最終發現 WinSCP 作為我需要的確切工具 - WinSCP 就具有此功能,使用檔案系統監視服務進行初始同步,然後持續更新:“將遠端目錄保持為日期” 。
在 Linux 上,有人可能會爭辯說,可以使用 sshfs 來完全避免同步的需要。在 Windows 上,samba 共用也會執行相同的操作。但是,我希望 IDE 能夠處理本機檔案(在 SSD 磁碟上!),而不必透過網路進行 PHP 索引等操作,這需要很長時間。
但 sshfs 可能是解決方案的一部分 - 因此只需要在兩個本地目錄之間完成持續同步。
有什麼想法或指示嗎?
答案1
您也可以使用inotifywait
inotify-tools 套件。
inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
echo need to rsync $MODFILE ...
done
答案2
左同步將是一個很好的解決方案。
Lsyncd 監視本機目錄樹事件監視器介面(inotify 或fsevents)。它會聚合並組合事件幾秒鐘,然後產生一個(或多個)進程來同步變更。預設情況下這是 rsync。因此,Lsyncd 是一種輕量級即時鏡像解決方案,安裝相對容易,不需要新的檔案系統或區塊設備,並且不會影響本地檔案系統的效能。
最重要的是,它使用與其他答案建議的相同類型的工具(inotify 和 rsync)來完成這項工作,但對於不熟悉 shell 腳本的人來說,設定更容易。
答案3
我非常需要這個,因為我的程式碼需要在遠端機器上運行,並且我在本機上編寫程式碼。我發現了一個很好的工具,您可以使用它來持續監視本機資料夾並將它們同步到遠端或本機資料夾:https://github.com/axkibe/lsyncd
透過 ssh 持續同步本機目錄與遠端電腦的簡單指令是:
lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>
就像任何其他 rsync 命令一樣,請確保提供正確的資料夾路徑並在執行命令之前進行檢查。我幾乎殺死了我的一台遠端計算機,因為我錯過了提供正確的目標目錄。確保您不會錯過遠端路徑並且不要使用“/”,除非您知道自己在做什麼。
答案4
我曾經做過的就是讓 bash 腳本ls -l
循環運行(有一些睡眠)並與之前的輸出進行比較。如果發生變化,請進行同步。
#!/bin/bash
listcommand="ls -l $*"
newfilelist=$( $listcommand )
while true
do
if [[ $oldfilelist != $newfilelist ]]
then
oldfilelist=$newfilelist
# run your synchronization tool
fi
sleep 10 || exit 2
newfilelist=$( $listcommand )
done
在新終端機中啟動此腳本,並將檔案名稱作為參數(放入同步工具後)。
(我用它來啟動編譯,而不是同步,但這會以類似的方式工作。)