Как сохранить cron от штамповки?

13

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

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

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

Buttons840
источник

Ответы:

7

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

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

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

laebshade
источник
15

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

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

Ladadadada
источник
14

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

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

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

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

Эндрю Шульман
источник
run-partsприсутствует также в системах Fedora / Red Hat.
Mattdm
9

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

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
Кит Томпсон
источник
0

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

Мэтт Симмонс
источник
1
Есть несколько потенциальных проблем с этим. Одним из них является то, что если вы делаете sleep 300между каждым выполнением команды, собственное выполнение команды приведет к смещению времени; он может работать каждые 15:10, а не каждые 15:00. И если фоновый процесс умирает или система перезагружается, в отличие от этого crond, он не будет автоматически перезагружаться. Есть способы «демонизировать» фоновый процесс, но тогда вы в значительной степени повторно реализуете crond.
Кит Томпсон
Да, я согласен, что это не идеальное решение (хотя вы всегда можете справиться с задачей с помощью &), но все готово.
Мэтт Симмонс
1
Вместо этого просто запустите cron один скрипт, который выполняет все ваши команды по очереди. Фактически, это настолько распространенная потребность, что существует стандартный скрипт, run-partsкоторый поставляется с большинством установок cron, чтобы сделать это специально. Смотрите ответ @ AndrewSchulman.
Tylerl
0

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

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

Том Ньютон
источник