Я недоволен cron на linux.
Я мог бы решить эту проблему с помощью оберток сценариев оболочки, но это «грязно».
До сих пор я использую vixie cron по умолчанию.
Как решить эту проблему? Есть ли альтернатива vixie cron?
Взгляни на fcron:
и, конечно, для того, чтобы сделать его действительно полезным, время, оставшееся до следующего выполнения, сохраняется каждый раз, когда система останавливается. Вы также можете сказать:
выполните эту команду один раз между 2:00 и 5:00, что будет выполнено, если система будет работать в любое время в течение этого интервала.
Fcron также включает полезную систему опций, которая может применяться либо к каждой строке, следующей за объявлением, либо к отдельной строке. Некоторые из поддерживаемых опций позволяют:
- запускать задания одно за другим (серийный номер опции fcrontab),
- установить максимальное среднее значение загрузки системы, при котором должно выполняться задание (опция fcrontab lavg),
- установить хорошее значение для задания (опция fcrontab nice),
- запускать задания при запуске 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 и всегда является случайным целым числом)
Это обычная практика именно по той причине, которую вы описываете. Я взял этот образец кода из cron-скрипта пакета yum-cron
на самом деле (находится в /etc/cron.daily
.
В зависимости от того, что вы делаете, система очередей фоновых заданий может быть такой: Спасать работай?
Нет ничего «грязного» в написании оболочки-оболочки для запуска ваших заданий cron при определенных условиях, случайные интервалы не устранят ваших проблем с загрузкой.
/etc/cron.hourly/wrapper_script
в ваших условиях, например, что делать под нагрузкой.
Хотя, если вы не можете запускать свои задачи cron под нагрузкой, я бы переоценил ваши задачи cron, например, могут ли они быть смещены для запуска в другом месте, выиграют ли они от сегментирования базы данных и т. Д.
Vixie Cron поддерживает джиттер, см. Здесь (1)
Что касается пропуска на основе нагрузки, вам нужно будет это взломать, я не знаю ни одного похожего на cron инструмента, который может это сделать.