我正在使用 rsync 将一些数据从一台服务器备份到另一台服务器。一切正常,但可能需要更长时间才能完成,具体取决于要传输的数据量。
有没有什么可靠的方法来确保 rsync 命令不会在前一个命令使用 cronjob 完成之前启动?
例如,我每小时运行一次 rsync 命令,但传输可能需要 1 个多小时才能完成,因此下一个命令会在前一个命令完成之前开始。
答案1
你可以实现某种锁定。这将打印仍在运行的 rsync 进程数:
pgrep -cx rsync
仅当不存在其他 rsync 进程时,才会运行 rsync:
pgrep -cx rsync || rsync ...
使用-x
将防止意外匹配不需要的名称(例如“fooba同步hronizator” 或 “not_an_”同步_totally” - 其工作原理与pgrep -c ^rsync$
)
答案2
您可以使用群命令来帮助你做到这一点,例如在这种情况下flock -n
可能是你想要的,因为它如果无法获得锁,将导致命令立即失败,例如
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
答案3
如果你愿意考虑其他工具,你也可以看看rdiff-备份。它使用 librsync 进行备份,并保存可配置数量的增量/增量。它还会锁定,以便在任何给定时间只有一个 rdiff-backup 进程可以运行。
答案4
我的回答和 Mike 所说的有些相同。
在脚本中,你应该输入如下内容:
- 创建锁文件
- 下次运行时检查锁文件是否存在。
但是您应该做一件非常重要的事情,那就是实施陷阱系统。
因此,有了它,您可以做的是,即使您的脚本以某种方式被终止或被某人终止了它,您也可以捕获该信号并删除锁文件,这样您就不会拥有过时的锁文件。
您可以阅读如何实现这里。
只有一件小事,你不能捕获信号 9,我的意思是如果有人这样做了kill -9
,你就无法捕获它,因为该信号直接与内核交互,并且没有办法捕获它。
此外,正如约翰所建议的,您需要在每次系统重新启动时删除锁定文件,以确保没有留下过时的文件。
您可以通过rm -f <FILE>
在 /etc/rc.local 中输入一个小命令轻松完成此操作。