Скажем, у меня есть несколько скриптов 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» и убедитесь, что вы начинаете с правильного #! строка для того, что вы собираетесь интерпретировать своим скриптом.