我需要每5秒钟左右检测一次目录(A)更改并从/在(B)远程目录上载/删除更改的文件的软件。
我找到了非商业软件https://github.com/devstructure/doubledown。我想知道是否还有其他商业选择?
我需要每5秒钟左右检测一次目录(A)更改并从/在(B)远程目录上载/删除更改的文件的软件。
我找到了非商业软件https://github.com/devstructure/doubledown。我想知道是否还有其他商业选择?
Answers:
rsync绝对是这项工作的正确工具。它的存在是为了使目录保持同步,并且可以用相当多的技巧做到这一点。例如:只要有可能,它将仅传输增量,并且可以在ssh隧道上工作。
假设您有托管目录树的实时版本的计算机源/my/tree
以及要与之保持紧密同步的计算机接收器。如果您在接收器上有一个ssh帐户,则可以从源使用rsync,如下所示:
rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree
这假设您要/my/tree
在接收器上与在源上具有完全相同的位置。当然,您无需将其放在完全相同的位置。
分解命令行:
-avz
:存档模式,详细,在传输过程中使用压缩--delete
:同步删除源中不存在的文件-e ssh
:使用ssh作为连接方法当然,拨打此电话时,系统会要求您输入密码。如果要以某种自动化方式执行此操作,则需要在计算机上的帐户之间共享一些密钥,并使用公共-私有密钥加密来建立ssh连接。
要为此rysnc设置密钥对,请在源计算机上运行以下命令:
> ssh-keygen -t rsa -b 2048 -f ~/.ssh/my-rsync-key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in ~/.ssh/my-rsync-key.
Your public key has been saved in ~/.ssh/my-rsync-key.pub.
The key fingerprint is:
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 root@source
> chmod 600 ~/.ssh/my-rsync-key
为了使此密钥对起作用,我们需要将其内容添加~/.ssh/my-rsync-key.pub
到~<remoteuser>/.ssh/authorized_keys
接收器计算机上的文件中。
首先将文件复制到接收器计算机:
scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~
然后ssh到接收器计算机,并通过在计算机上以remoteuser身份运行以下命令来导入密钥:
> if [ ! -d ~/.ssh ]; then mkdir ~/.ssh ; chmod 700 ~/.ssh ; fi
cd ~/.ssh/
if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi
cat ~/my-rsync-key.pub >> authorized_keys
rm ~/my-rsync-key.pub
有关锁定源计算机和宿计算机之间的ssh连接的其他提示,建议您查看此页面。
在您的源计算机上,您可以通过运行以下命令来测试此设置是否有效:
rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree
这将使rsync失效。如果您看到rsync命令连接并比较了文件,则说明一切设置正确。
现在,我们需要一种简单的方法来从LaunchD配置文件中调用此rsync命令,如本站点上的此有用答案所示。由于您希望此调用在紧密的循环中进行,因此需要确保您没有同时运行rsync的多个副本。您可以使用flock创建一个互斥体,以确保bash脚本是单例的:每个实例仅在一台机器上运行一次。因此,我们将在磁盘上创建以下脚本:
#!/bin/sh
SINK_INSTANCE=remoteuser@sink
DIR=/my/tree
KEY=~/.ssh/my-rsync-key
LOG = ~/my_rsync.log
LOCK = ~/my_rsync.lock
SOURCE=/my/tree
exec 9>${LOCK}
if ! flock -n 9 ; then
echo "Another instance of your rsync is already running";
exit 1
fi
echo "----------" >> ${LOG}
echo `date` >> ${LOG}
rsync -avz --delete -e "ssh -i ${KEY}" \
${SOURCE}/ {SINK_INSTANCE}:${SOURCE} 2>&1 >> ${LOG}
将其另存为~/my_rsync.sh
。
该脚本将为您执行rsync。现在您需要做的就是通过LaunchD进行设置并使其紧密运行。按照此处的指示进行修改,以满足我们的需求,我们将~/Library/LaunchAgents/my-rsync.plist
在文本编辑器中创建并制作内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>My Rsync</string>
<key>Program</key>
<string>/bin/sh</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>while sleep 5s; /Users/my/my_rsync.sh; done</string>
</array>
<key>ServiceDescription</key>
<string>Keep /my/tree synchronized with the machine sink</string>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
那应该照顾的事情。
通常需要注意以下几点:我是从内存中写出来的,没有进行测试。因此,请勿盲目跟进。一路仔细测试。如有疑问,请--dry-run
在rsync上使用该选项。它会打印出本来可以做的事,而无需实际执行任何操作。
rsync将是一个很好的工具,它内置在Mac OS中。它将检查两个位置之间的差异,然后仅在网络上复制增量更改。没有任何额外标志的rsync几乎可以完全满足您的需求。
唯一的补充是您需要每5秒运行一次以检查更改。您可以通过使用launchd来做到这一点,该站点上已经有一个很好的例子。在此示例中,脚本似乎保持运行,然后休眠5秒钟,然后再次运行。
经常运行此命令的问题是该工具还必须检查差异,如果5秒钟内有太多更改,则记录这些更改并进行传输的开销可能会超过5秒钟。
Folderwatch是Appstore仅$ 11.99的商业替代产品。Folderwatch将HFS-Plus格式的卷上的文件夹实时同步(镜像)到外部驱动器和AFP文件服务器。http://itunes.apple.com/us/app/folderwatch/id408224368?mt=12