我对 Linux 上的 cron 不满意。
- 负载峰值:@hourly 作业会产生负载峰值。我想要一个随机偏移量(每个作业)。
- 高负载:跳过一些作业:如果负载太高,我想跳过一些作业。
我可以使用 shell 脚本包装器来解决这个问题,但是这很“肮脏”。
到目前为止,我使用默认的 vixie cron。
您如何解决这个问题?有没有 vixie cron 的替代品?
答案1
看一眼克隆:
当然,为了使其真正有用,每次系统停止时都会保存到下次执行的剩余时间。您还可以这样写:
在凌晨 2 点到 5 点之间运行一次该命令,如果系统在此时间间隔内的任何时间运行,则将执行该命令。
Fcron 还包含一个实用的选项系统,可以将其应用于声明后的每一行或单行。一些受支持的选项允许:
- 逐个运行作业(fcrontab 选项 serial),
- 设置作业应运行的最大系统负载平均值(fcrontab 选项 lavg),
- 为作业设置一个好值(fcrontab 选项很好),
- 如果作业应该在系统停机期间运行,则在 fcron 启动时运行它们(fcrontab 选项 bootrun),
答案2
您需要的很简单。将您的作业保留在 @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 上的特殊 shell 变量,并且始终是随机整数)
这正是您所描述的原因,这是一种常见的做法。我yum-cron
实际上是从包的 cron 脚本中获取此代码示例的(位于/etc/cron.daily
。
答案3
根据你正在做的事情,后台作业排队系统会像救援工作?
答案4
Vixie Cron 支持抖动,参见此处(1)
至于根据负载跳过,您将需要对此进行破解,我不知道有任何类似 cron 的工具可以做到这一点。