随机化服务器之间的 crontab 条目的分钟数

随机化服务器之间的 crontab 条目的分钟数

我有一个共同点木偶一组服务器的配方。其中一个 puppet 管理文件是/etc/crontab包含原始cron.dailycron.weeklycron.monthly条目。

此处公用文件的问题/etc/crontab是,所有 cronjob 都在我们所有服务器上同时运行。例如,每日备份会消耗我们所有备份服务器的资源,因为所有服务器都同时为其提供数据。

在保持所有服务器之间木偶配方通用的同时,随机化服务器之间每日/每周/每月运行的精确分钟的首选方法是什么?

我一直在考虑几个不同的选择:

  • 在实际作业之前运行sleep& $RANDOM。这样,crontab每个主机上的作业都会类似,但运行每日/每周作业的确切时间会有所不同。即使在同一台服务器内也会有差异(例如,每日运行间隔可能在 23-25 小时之间变化)。
  • 根据主机名计算整数值,并使用at+“基于主机名的整数”分钟运行所有作业。有点老套,但可能有效...
  • 还有其他方法,但是是什么呢?

答案1

Puppet 有一个fqdn_rand您可以为此使用以下函数:

minute => fqdn_rand(60)

答案2

您不应该随机化 cronjobs,而应该随机化您的脚本sleep

我通常这样做:

sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob

这样,所有的 cronjobs 就可以同时启动,但它们会在 之间随机休眠0 and 120

答案3

是的,您可以通过散列 FQDN 来获取“随机”整数。在 erb-template 中:

<%= Time.at( fqdn.hash % 10000 ).strftime('%M')  %> * * * * myuser /bin/mycommand

但是 puppet 可以做得更优雅。在 manifest 中:

$minute = inline_template("<%= Time.at( fqdn.hash % 10000 ).strftime('%M')  %>")
cron { my-cron:
    minute => $minute,
    ...
}

答案4

这里有很多不同类型的实现示例: http://projects.puppetlabs.com/projects/1/wiki/Cron_Patterns

相关内容