我有几台运行 rsyncd 的服务器。我不使用 ssh 隧道,而是使用本机 rsync 协议。同步文件的一个文件夹包含应形成 ISO 映像的文件。每当该文件夹中的文件上传(从远程推送到此服务器)时,它应自动重新创建 iso 文件。理想情况下,只有文件内容或大小更改才能触发此操作,因为我想在用户可以下载和刻录它的网页中显示上次更改 iso 的日期。
因为iso很大,如果只有一个文件更改,我想在每台服务器上创建它。我不想同步iso本身
小智 5
这更像是对 Gilles 的回应,但我想格式化一些代码;您可以监视已更改文件的一种巧妙方法是存储目录的 md5sum 的 md5sum,ala:
find /path/to/iso/data/ -type f -exec md5sum {} + | awk '{print $1}' | sort | md5sum | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
...它为您提供以下类型的输出:
b843afc89097f0abc062e0d0e14d480b
Run Code Online (Sandbox Code Playgroud)
如果您在 cron 的每次迭代中保存它,这是一种非常快速有效的方法来确定目标上的内容是否已更改。您甚至可以围绕 xinetd rsync 守护进程构建一个包装器;替换对 /etc/xinetd.d/rsync 中的二进制文件的调用:
server = /usr/bin/rsync
Run Code Online (Sandbox Code Playgroud)
...使用脚本:
server = /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)
然后在您的脚本中比较并在守护进程每次以有效 0 状态退出时执行此操作。这比 cron 作业更自动化,好处是它只有在您将其编码为 rsync exit 0 时才能运行。类似于...(此处为伪代码):
#!/bin/sh
/usr/bin/rsync "$*"
if [ $? -eq 0 ]; then
OLDVALUE=`cat /var/cache/isodata.txt`
NEWVALUE=`find /path/to/iso/data/ -type f -exec md5sum {} + | awk '{print $1}' | sort | md5sum | awk '{print $1}'`
if [ ${OLDVALUE} != ${NEWVALUE} ]; then
-- run ISO making code --
echo ${NEWVALUE} > /var/cache/isodata.txt
fi
fi
Run Code Online (Sandbox Code Playgroud)
这是开始时的总体思路。