防止备份并行运行

防止备份并行运行

在我的脚本中/usr/local/bin/backup,我每小时调用一次/etc/crontab,我使用同步将数据复制到异地服务器。即使我们拥有的新数据多于一小时内推出的数据,这一切都运行良好。

上周有人在数据分区上复制了一个 11GB 的文件,第二天我发现有 14 个 rsync 程序并行运行,每个程序都没有带宽,并且每个程序可能都在处理同一个大文件。我将它们全部杀死(在意识到我应该让第一个运行之前),停止 cron 作业并手动运行备份脚本。

我可以在启动 rsync 之前在脚本中写出一个文件,并在脚本中检查该文件是否已存在,以防止备份并行运行。有更简单的方法吗?

我的/etc/crontab条目:

5  *  *  *  *   root  /usr/local/bin/backup

答案1

有不同的方法可以做到这一点,但我认为最简单的方法是插入crontab 文件中的命令之前:

5  *  *  *  *   root  flock -n /var/lock/backup /usr/local/bin/backup

/var/lock/backup文件是集群使用的锁,-n如果锁已经存在,则立即使命令失败。

当然,这可能意味着,如果一次备份需要 1 小时 1 分钟,则下一次备份将在 59 分钟后开始。如果这是一个问题,您可以考虑使用-x.

答案2

在最近的 OpenBSD 安装(OpenBSD 6.7,自 2020 年 4 月 16 日快照以来)中,您可以-s在计划本身中使用可选选项以避免作业实例重叠:

5 * * * * root -s /usr/local/bin/backup

或者,在 root 用户自己的 crontab 中,

5 * * * * -s /usr/local/bin/backup

来自OpenBSDcrontab(5)手册:

命令可以修改如下:

[...]

-s command 只有一个实例command会同时运行。command在前一个实例完成之前,不会安排其他实例。

相关内容