在我的脚本中/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
命令可以修改如下:
[...]
-s command
只有一个实例command
会同时运行。command
在前一个实例完成之前,不会安排其他实例。