使cronjob等待先前的rsync作业完成


11

我正在使用rsync将某些数据从一台服务器备份到另一台服务器。一切正常,但完成时间可能会长一些,具体取决于要传输的数据量。

有什么保证方法可以确保在上一个命令使用cronjob完成之前不启动rsync命令?

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


如果作业可能要花费超过一小时才能完成,并且您将其安排的时间比持续时间更短,则可能是对作业的排错了时间。找出如何减少时间或增加作业间隔。如果您一直在进行远程备份,则可能需要考虑制定新的灾难恢复计划。
vgoff 2012年

Answers:


11

您可以实现某种锁定。这将打印仍在运行的rsync进程数:

pgrep -cx rsync

并且只有在不存在其他rsync进程的情况下,此命令才会运行rsync:

pgrep -cx rsync || rsync ...

使用-x可以防止意外匹配不需要的名称(例如“ fooba rsync hronizator”或“ not_an_ rsync _totally”-就像pgrep -c ^rsync$


以防不明显。-c计算名称为rsync的进程数。如果该值不为0,则Shell会将结果解释为true(不是false)。|| “或行”看到第一个项目为true,并且不必费心运行第二个项目rsync。

13

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

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

通常,由于竞争条件和对/ tmp目录的广泛访问,/ tmp中可预测的文件名通常很危险。在这种情况下安全吗?
mc0e

在这种情况下,可预测的名称不仅安全,而且很有必要;这就是使锁定(名词)锁定(动词)的原因。换句话说,锁的状态专门且仅基于具有特定的,可预测的名称的文件的存在。如果文件名是不可预测的,或者它是动态更改的,则flock将允许rsync在其自身上运行,从而无法达到目的。但是,通过将锁定文件放在某个位置(例如),可以减轻您的担忧,并使imo更加“正确” /var/run
埃文·德拉克鲁兹

3

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


我也使用rdiff-backup。但是,在此设置中您需要格外小心,因为与单独使用rsync相比,rdiff-backup需要花费更多时间。
mgabriel

3

这就是我要做的。在rsync周围创建一个包装器脚本,以创建一个锁定文件。

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

2
只需确保在重新启动后还删除了锁定文件,否则您可能会遇到一个永远不会再运行的进程。
John Gardeniers 2012年

2

我的答案与迈克说的有些相同。

在脚本中,您应该输入以下内容:

  • 创建一个锁定文件
  • 下次运行锁文件时,请检查锁文件是否存在。

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

因此,您可以做的是,即使您的脚本被某种方式杀死或有人杀死了它,您也可以捕获该信号并删除锁定文件,从而没有陈旧的锁定文件。

您可以在此处阅读如何实现该功能。

一件小事,您就无法捕获信号9,我的意思是,如果有人这样做kill -9,您就无法捕获信号,因为该信号直接与内核交互,因此无法捕获它。

另外,按照John的建议,每次系统重新启动时,都需要删除锁定文件,只是要确保没有剩余的过时文件。

您可以通过rm -f <FILE>在/etc/rc.local中放置一个小命令来轻松实现


1

使用-s(序列化)开关查看anacron(过时的cron)。序列化可确保如果前一个命令仍在运行,则不会再次调用该命令。


您可能误解了这个问题。
John Gardeniers 2012年

我不这么认为。问题是“是否有任何保证方法来确保rsync命令在上一个使用cronjob完成之前不会启动?” Anacron运行具有额外/不同功能的cronjobs。序列化可确保您调用的任何命令在上一个命令完成之前不会开始。
tu-Reinstate Monica-dor duh 2012

我很抱歉。是误解了这个问题。
John Gardeniers


0

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

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

我使用ping作为示例命令。

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.