Назад | Перейти на главную страницу

Как уберечь cron от штамповки?

Скажем, у меня есть несколько скриптов cron, которые нужно запускать каждые 15 минут. Я мог бы запустить их: */15 * * * * , но тогда все они работают одновременно. Кажется глупым, если сервер простаивает несколько минут, а затем внезапно пытается выполнить дюжину сценариев одновременно.

Есть ли способ запустить один скрипт на 1, 16, 31, 46 минуте, а другой на 2, 17, 32, 47?

Другими словами, я хочу, чтобы каждый скрипт запускался каждые 15 минут, но меня не волнует, что они выполняются специально на отметках четверти часа.

Если вы сделаете свою работу cron так: 6-59/15 * * * * затем он будет работать в 6, 21, 36 и 51 минуту в час.

Это может работать не со всеми версиями cron.

Вы можете поместить все сценарии в каталог, например /etc/cron.15m, а затем запустите cron

*/15 * * * * run-parts /etc/cron.15m

Это при условии, что у вас есть run-parts команда. По крайней мере, он присутствует во всех системах на базе Debian. Он запускает все исполняемые программы в указанном каталоге по одной в порядке списка.

Недостатком этого метода является то, что если один из скриптов зависнет, все остальные будут ждать и не будут выполнены. Если время выполнения всех из них составляет более 15 минут, задание будет запущено снова, и вы можете накопить множество процессов.

Самый простой способ сделать это - просто вручную настроить команды для запуска, когда вы хотите:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Или вы можете написать сценарий для автоматической генерации соответствующих записей crontab (чтобы избежать опечаток).

Некоторые версии cron (возможно, включая ту, которую вы используете) принимают расширенный синтаксис:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

Вы делаете это сложнее, чем должно быть. Поместите их все в одну строку, разделив точкой с запятой:

*/15 * * * * command1 ; command 2 ; command 3

Он будет работать command1, дождитесь завершения, затем запустите command2, дождитесь его завершения и так далее.

Cron не очень хорош в том, что вы пытаетесь сделать. Думали ли вы о написании сценария, который действует как демон, который в основном спит 15 минут, выполняет команду, а затем зацикливается?

Во многих дистрибутивах есть /etc/cron.d/cronhourly, для которого все скрипты внутри него запускаются ежечасно. Вы даже можете указать порядок, начав их с последовательных чисел, например 01scriptA 02scriptB - это должно быть тривиально с учетом знаний cron, которые у вас уже есть, чтобы создать "cronhourlybyfour", как мы называем это в базе дистрибутива Smoothwall для Linux :)

Предупреждение: здесь используются run-parts, как предлагалось ранее, а run-parts НЕ любит скрипты с расширением. в имени, поэтому не называйте его «deletehomefolders.sh», назовите его «01deletehomefolders» и убедитесь, что вы начинаете с правильного #! строка для того, что вы собираетесь интерпретировать своим скриптом.