我对linux上的cron不满意。
我可以用shell脚本包装来解决这个问题,但这是“脏”的。
到目前为止,我使用默认的vixie cron。
你如何解决这个问题? 任何替代的VIXIE CRON?
看看fcron :
当然,为了使其真正有用,每当系统停止时,直到下一次执行的剩余时间才被保存。 你也可以说:
在凌晨2点到5点之间运行该命令,如果系统在此间隔的任何时间运行,将执行该命令。
Fcron还包含一个有用的选项系统,它可以应用于声明之后的每一行或单行。 一些支持的选项允许:
- 逐个运行作业(fcrontab选项序列),
- 设置作业应该运行的最大系统负载平均值(fcrontab选项lavg),
- 为工作设置一个不错的价值(fcrontab选项不错),
- 在fcron启动时运行作业,如果它们应该在系统停机时间运行(fcrontab选项bootrun),
你需要的是简单的。 把你的工作留在@Hourly,而不是直接调用一个命令,而是使用一个bash包装,其中包含以下函数:
#! /bin/bash # Random wait function RANDOMWAIT=60 random_wait() { sleep $(( $RANDOM % ($RANDOMWAIT * 60) + 1 )) } run_job() { your-cron-command-here } random_wait run_job
这会延迟执行一段时间(从1到60分钟)。 将RANDOMWAIT更改为更大的值以获得更大的范围。 ($ RANDOM是Linux上一个特殊的shellvariables,并且始终是一个随机整数)
这正是你描述的原因。 我从yum-cron包的cron脚本中实际获取了这个代码示例(位于/etc/cron.daily 。
根据你在做什么,后台工作排队系统像Resque工作?
在某些情况下编写shell封装器来运行你的cron作业没有什么“肮脏的”,随机的时间间隔不会消除你的负载问题。
/etc/cron.hourly/wrapper_script
在你的条件下,比如在负载下做什么。
虽然如果你不能在加载时运行你的cron任务,我会重新评估你的cron任务,比如它们可以被抵消到其他地方运行,他们是否会受益于数据库分片等等。
Vixie Cron支持抖动,请参阅这里(1)
至于基于负载的跳过去,你将需要破解这个,我不知道任何类似cron的工具可以做到这一点。