我有rsyncd正在运行的几个服务器。 我不使用ssh隧道,而是使用本地rsync协议。 同步文件的一个文件夹包含应该形成ISO映像的文件。 每当文件夹中的文件被上传(从远端推送到该服务器)时,它将自动重新创buildiso文件。 理想情况下,只有文件内容或大小的变化应该触发这个,因为我想显示在网页内的用户可以下载和刻录的最后一次更改的date。
因为iso很大,所以我想在每个服务器上创build一个文件。 我不想同步iso本身
这更多的是对Gilles的回应,但我想要格式化一些代码; 你可以做一个简单的方法来监视已更改的文件是存储目录的md5sum的md5sum,ala:
find /path/to/iso/data/ -type f -exec md5sum {} + | awk '{print $1}' | sort | md5sum | awk '{print $1}'
…它给你输出的types:
b843afc89097f0abc062e0d0e14d480b
如果在cron的每次迭代中都保存这个值,那么确定内容是否在目标上发生了变化是非常快速有效的方法。 你甚至可以围绕xinetd rsync守护进程构build一个包装器; 将调用replace为/etc/xinetd.d/rsync中的二进制文件:
server = /usr/bin/rsync
…用脚本:
server = /path/to/script.sh
然后在你的脚本中比较,每当守护进程退出时有一个有效的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
这是开始的总体思路。
传统的便携式笨拙的方法是定期运行iso生成脚本,或者通过cron或者一段while sleep循环(如果间隔不显着大于再生iso的时间,则更好)。 如果文件没有改变,为了避免重新生成iso文件,只有在[ -n "$(find -cnewer foo.iso -print -quit)" ] 。 请注意,如果某些文件被删除,并且没有更改或添加,则不会触发。
更好但不可移植的方法是使用您的平台的文件更改监视API:IRIX和其他一些系统上的fam,* BSD上的kqueue,Linux上的inotify等等。所有可以很容易地设置为运行一个命令,如果一个文件更改(包括目录); 我不知道他们是否都可以看一个目录树。
一种不同的方式是将文件放在只传递给底层存储的用户级文件系统(如FUSE)上,除了修改触发了iso的重新生成。
无论你最终做什么,注意一个文件可能会改变,而你正在重新生成的ISO; 在这种情况下,你有两个策略。 你可以等到世代完成后重新开始,这很浪费。 或者你可以杀死iso代,然后重新启动,但如果文件的修改速度比iso更快,那么可能会导致很长时间没有iso更新。 除非在X时间内没有生成iso,否则杀死iso代的两者的组合是合理的解决scheme。