使cronjob等待以前的rsync工作完成

我正在使用rsync从一台服务器备份一些数据到另一台。 所有的工作都很好,但是可能需要更长的时间才能完成,具体取决于需要传输多less数据。

有没有任何方法确保rsync命令在上一个使用cronjob之前没有启动?

例如,我每隔一小时运行一次rsync命令,但是可能的传输需要1个多小时才能完成,因此下一个将在前一个完成之前开始。

你可以实现某种locking来检查rsync是否仍在运行:

pgrep -c rsync 

从评论编辑和添加:

 pgrep -c rsync || rsync ... 

只有当没有运行的rsync进程时,才会运行rsync命令。

您可以使用flock命令来帮助您执行此操作。例如,在这种情况下, flock -n可能是您想要的,因为如果命令无法获得locking,将会立即导致命令失败

 30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

如果你愿意考虑其他工具,你也可以看看rdiff-backup 。 它使用librsync进行备份,并保存一个可configuration数量的增量/增量。 它也locking,以便在任何给定的时间只能运行一个rdiff备份进程。

这是我要做的。 创build一个围绕rsync的包装脚本来创build一个锁文件。

 script 1 - create lock file - rsync - remove lock file script 2 (running later then script 1) - check if lock file is there - if not run - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone - continue to run script 

我的答案与Mike所说的相同。

在脚本中,你应该把这样的东西:

  • 创build一个锁文件
  • 下次运行时检查是否存在locking文件。

但是你应该做一件非常重要的事情。 并实施一个陷阱系统。

所以,你可以做的是,即使你的脚本被杀死了,或者有人杀死了它,你也可以捕获这个信号并删除locking文件,这样你就不会有失效的locking文件。

你可以阅读如何在这里实现。

只是一件小事情,你不能捕获信号9,我的意思是如果有人kill -9 ,你不能捕获信号,因为这个信号直接与内核交互,并且没有办法陷阱。

另外,正如John所build议的那样,每次系统重新启动时,您都需要删除locking文件,以确保没有过时的文件。

你可以通过在/etc/rc.local中放入一个小的rm -f <FILE>命令来轻松完成

用-s(serialize)开关来看看anacron(anachronistic cron)。 Serialize确保如果前一个仍在运行,则不会再次调用该命令。

使用hatools( http://www.fatalmind.com/software/hatools/ )在等待模式下lockingrsync cron。

我无法得到mgabriel的解决scheme在OSX上工作,因为OSX版本的pgrep似乎没有-c选项(我认为这是计数)。 相反,我使用了以下内容:

 [ $(pgrep ping | wc -l) -eq 0 ] && ping multiplay.co.uk || echo "Sorry, ping already in progress" 

我使用ping作为示例命令。

希望这可以帮助。