让 cronjob 等待上一个 rsync 任务完成

让 cronjob 等待上一个 rsync 任务完成

我正在使用 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 中输入一个小命令轻松完成此操作。

相关内容