Linux:一种方式连续同步文件


61

方案:在Linux桌面盒上设置了一个IDE,可以在本地编辑PHP文件。每次保存文件时,我都希望此更改显示在运行Apache的Linux服务器上。服务器具有ssh(以及samba和nfs)。

作为参考,当我在Windows上编辑文件时,我终于通过WinSCP找到了我需要的确切工具-WinSCP仅具有此功能,并具有初始同步性,然后使用文件系统监视服务进行连续更新:日期”。

在Linux上,人们可能会争辩说可以使用sshfs来完全避免同步的需求。在Windows上,Samba共享将执行相同的操作。但是,我希望IDE使用本地文件(在SSD磁盘上!),而不必通过网络进行PHP索引和诸如此类的工作,这需要很长时间。

但是sshfs可能仍然是解决方案的一部分-因此,仅需要在两个本地目录之间进行连续同步。

有什么想法或建议吗?


考虑使用rsync工具,或在Web服务器的文档根目录中共享文件夹,以便可以直接在Windows下操作这些文件
Vinicius Kamakura

2
rsync是“一劳永逸”。我需要不断的更新,这就是这里的全部要点-编辑文件,保存它,然后我请求的产品/系统/想法将选择此保存操作并立即上载新版本。注意:双方都是Linux。NB2:我想在本地文件上进行编辑,否则sshfs本身会删除它。
stolsvik 2011年

6
偏离主题的选民,这是一个边界情况,但我认为它在FAQ中的“程序员常用工具”下是相当清楚的。
Karl Bielefeldt

虽然这不是一个完美的选择,但您可以看看overlayfs
phs

Answers:


57

您也可以inotifywait从inotify-tools包中使用。

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done

13
inotify-tools网站上,有一个使用inotify-wait触发rsync的很好的例子。
Karl Bielefeldt

昨晚我一直在寻找这个确切的东西!ahhh,我爱超级用户
CenterOrbit 2011年

有办法做到这一点,但要保持插座打开吗?rsync/ scp在建立ssh连接时会有烦人的延迟。
Flash

1
@Flash是的,您可以使用SSH多路复用来保持套接字打开。
Will Angley

31

Lsyncd将是一个很好的解决方案。

Lsyncd监视本地目录树事件监视器界面(intify或fsevents)。它会汇总并合并事件几秒钟,然后生成一个(或多个)进程来同步更改。默认情况下,这是rsync。因此,Lsyncd是一种轻量级的实时镜像解决方案,相对易于安装,不需要新的文件系统或块设备,也不会影响本地文件系统的性能。

归根结底,它使用与其他答案所建议的工具相同的工具(inotify和rsync)来完成这项工作,但对于不熟悉Shell脚本的人来说,设置起来更容易。


它不仅更容易,而且还尝试处理诸如在不进行rsync的情况下正确移动目录的情况。
Ciantic

5
注意:该程序具有一些有问题的功能。撰写本文时:1.默认情况下,它将删除源中不存在的远程文件。2.“远程:”是指“远程:/”,而不是主文件夹。3.它守护进程,因此您不知道发生了什么。4.它不会立即遵守TERM信号。
弗里德里希(Friedrich)

27

我非常需要此代码,因为我的代码需要在远程机器上运行,并且需要在本地计算机上编写代码。我找到了一个不错的工具,可用于持续监视本地文件夹并将其同步到远程或本地文件夹:https : //github.com/axkibe/lsyncd

一个简单的通过ssh连续将本地目录与远程计算机同步的命令是:

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

与其他rsync命令一样,请确保您正确指定了文件夹路径并在运行命令之前进行检查。我几乎杀死了我的一台远程计算机,因为我错过了提供正确的目标目录的机会。确保您不要错过远程路径,并且不要使用“ /”,除非您知道自己在做什么。


即使在发布三年之后,也应该进行更多的投票
FliiFe

效果很好,终于在我的Mac OS Sierra上运行了,效果很棒。
Erik van de Ven

2

如果您需要观察文件系统,那么inotify是实现它的方法。我将使用pyinotify编写一个简单的python脚本,以在文件系统更改时执行同步。请参阅文档。您也可以检查一下autosync.py以获得一些启发。玩得开心。


1

我曾经做过的事情是让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

在新终端中以文件名作为参数启动此脚本(放入同步工具之后)。

(我用它来开始编译,而不是进行同步,但这将以类似的方式工作。)


-1

更简单的方法:

使用samba(或nfs)导出/ var / www,然后直接在服务器上处理文件。

另一个解决方案:大多数IDE都允许进行各种部署配置-检查是否有适合您的配置。

或设置源代码管理系统,如Git,Bazaar等。

祝好运 !!


3
谢谢回答。但是,我在问题中特别排除了这种方法。
stolsvik'8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.