cron каждый день в 9 утра
Настройка cron
Предположим нам нужно запускать определенную задачу каждый день, или, может, каждую субботу в 12 ночи? В Unix-подобных системах существует возможность автоматизировать запуск повторяющихся задач при помощи демона планировщика задач cron. В данной статье будут рассмотрены основы работы с ним.
Все описанное в данной статье тестируется в ОС Linux Debian 6.0 squeeze, однако в большинстве случаев будет работать на других Unix-подобных операционных системах.
Основные команды
Для управления планировщиком задач используется команда crontab со следующими ключами:
Синтаксис cron
В общем виде задача крон представляет собой строку вида:
Каждой звездочке в строке соответствует определенное значение:
* | * | * | * | * | команда |
Минута (0-59) | Час (0-23) | День (1-31) | Месяц (1-12) | День недели (0-7) | Строка выполняемой команды |
Из вышеперечисленного следует, что следующие записи соответствуют следующим строкам:
Так же в файле crontab можно записывать следующие предопределенные значения:
Пример файла crontab
#Привет, я файл crontab пользователя user, и вот чему научил меня мой хозяин
#Я здороваюсь с ним после своей загрузки
@reboot echo ‘Привет, Хозяин!’
#Каждый рабочий день в 6:45 я запускаю для него скрипт,
#который включает будильник
45 6 * * 1-5 /home/user/beep.sh
#Пока хозяин добирается до работы или высыпается в выходной день,
#я присылаю для него свежие новости (каждый день в 8 утра)
0 8 * * * /home/user/newsmail.sh
#И я поздравляю его
@yearly echo ‘С Новым годом’
Настройка Cron
Именно для этих задач в Linux используется системный сервис cron. Это планировщик, который позволяет выполнять нужные вам скрипты раз в час, раз в день, неделю или месяц, а также в любое заданное вами время или через любой интервал. Программа часто используется даже другими службами операционной системы. В этой статье мы рассмотрим как выполняется настройка Cron и разберем основные часто используемые примеры.
Как работает Cron?
В этих папках должны находиться скрипты, которые нужно выполнять с указанным интервалом. Скрипты должны иметь права на выполнение и их имя не должно содержать точки. Это очень сильно облегчает работу с планировщиком для новых пользователей. Также в файле crontab прописан запуск команды anacron, которая работает так же как и cron, только предназначена для задач, которые нужно выполнять раз в длительный период, например, раз в день, неделю, месяц, год.
Она позволяет выполнять их даже если компьютер работает не всегда и время от времени выключается. Дата выполнения задания последний раз записывается в файл /var/spool/anacron, а затем, при следующем запуске anacron проверяет был ли запущен нужный процесс в нужное время, и если нет, то запускает его. Сам же сервис cron больше рассчитан на выполнение задач в течение дня или с точно расписанным временем и датой.
Настройка Cron
Для настройки времени, даты и интервала когда нужно выполнять задание используется специальный синтаксис файла cron и специальная команда. Конечно, вы всегда можете отредактировать файл /etc/crontab, но этого делать не рекомендуется. Вместо этого, есть команда crontab:
Поэтому тут нужно быть аккуратным, и если вам нужно выполнять скрипты от рута, то и crontab нужно выполнить от рута, а не от пользователя. Это часто становится причиной проблем.
Синтаксис crontab
Как я уже говорил, время задается особым синтаксисом, давайте рассмотрим синтаксис настройки одной задачи cron:
минута час день месяц день_недели /путь/к/исполняемому/файлу
Примеры настройки cron
Далее, усложним, будем запускать каждый час, в нулевую минуту:
Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:
0 0 * * * /usr/local/bin/serve
Если идти так дальше, то можно запускать в первый день каждого месяца:
0 0 1 * * /usr/local/bin/serve
Можно в любой день, например, 15 числа:
0 0 15 * * /usr/local/bin/serve
В первый день недели первого месяца года, 0 часов 0 минут:
0 0 * 1 0 /usr/local/bin/serve
Или в нулевой день недели каждого месяца:
0 0 * * 0 /usr/local/bin/serve
Вы можете выбрать любую минуту, час и день недели, например, 15.30 во вторник:
30 15 * * 2 /usr/local/bin/serve
30 15 * * sun /usr/local/bin/serve
Для того чтобы указать определенный интервал нужно использовать символ «-«, например, каждый час, с семи утра до семи вечера:
0 7-19 * * * /usr/local/bin/serve
Если нужно запустить команду несколько раз, можно использовать разделитель «,». Например, запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:
5,35 16 * * * /usr/local/bin/serve
Кроме того, для некоторых часто используемых наборов были придуманы переменные, вот они:
Например, вот так просто будет выглядеть команда запуска скрипта раз в час:
Если же вы собрались добавить скрипт в одну из папок, то, как я уже говорил, нужно чтобы его имя было без точек и у него были права на выполнение:
sudo vi /etc/corn.daily/basckup
Скрипт должен выглядеть подобным образом. Теперь вы знаете как настроить cron, осталось проверить как все работает.
Отладка работы
После того как вы настроили правила, еще хотелось бы проверить работают ли они. Для этого ждем того времени, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron, а иногда пишется в syslog. Например, у меня в crontab есть такая строка:
Она должна выполняться в 19.40 каждый день, теперь смотрим лог:
grep CRON /var/log/syslog
И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут же было бы выведено сообщение.
Если нужно проверить скрипт, который находится в одной из специализированных папок, то тут еще проще, просто запустите run-paths, передав ей в параметр нужную папку или даже сам скрипт:
sudo run-paths /etc/cron.daily/
Дальше вы увидите весь вывод, включая вывод скрипта и сможете быстро понять в чем проблема.
Выводы
В этой статье мы рассмотрели как выполняется настройка cron для удобного планирования автоматических задач. Надеюсь, эта информация была полезной для вас.
Cron каждый день в 9 утра
MIN HOUR DOM MON DOW CMD
Таблица: Поля и допустимые диапазоны Crontab (синтаксис Linux Crontab)
Поле | Описание | Допустимое значение |
---|---|---|
MIN | Минуты | От 0 до 59 |
HOUR | Часы | От 0 до 23 |
DOM | День месяца | 1-31 |
MON | Месяц | 1-12 |
DOW | День недели | 0-6 |
CMD | Команда | Любая команда, которую требуется выполнить |
1. Планирование задач в течение определённого времени
Основа использования cron – выполнение задач в определённое время, как показано ниже. Это будет выполнять скрипт полного резервного копирования (full-backup) 10 июня в 8.30.
Пожалуйста, обратите внимание, что поле времени использует 24-часовой формат, Так что 8 АМ – 8, 8 РМ – 20 часов.
2. Расписание задач для более частого выполнения (например, дважды в день)
Следующий скрипт использует дополнительное резервное копирование дважды в день каждый день. В этом примере выполняется дополнительное резервное копирование (incremental-backup) в 11:00 и в 16:00 каждый день. Значения через запятую в поле указывают, что команда должна быть выполнена в каждое указанное время.
3. Расписание работы в течение определённого интервала времени (например, только в будние дни)
Если вы хотите, чтобы подпрограммы выполнялись в течение каждого часа с определённым интервалом времени, используйте следующее.
Подпрограмма Cron для каждого дня в течение рабочих часов
Этот пример каждый день проверяет состояние базы данных (включая выходные) в течение рабочих часов с 9 утра до 6 вечера.
Подпрограмма Cron для каждого рабочего дня в течение рабочих часов
Этот пример проверяет состояние базы данных каждый рабочий день (кроме субботы и воскресенья) с 9 утра до 6 вечера.
4. Как просмотреть записи Crontab?
Просмотр текущих Crontab-файлов пользователя.
Чтобы просмотреть ваши файлы crontab-l из вышей учётной записи unix, проделайте следующее.
Просмотр root записей crontab
Практические рекомендации crontab: просмотрите другие записи crontab пользователя linux.
5. Как редактировать записи crontab?
Редактирование текущих пользовательских cron-записей.
Когда вы сохраните файл, он сохранит crontab и покажет следующее сообщение, где будет сказано, что crontab успешно изменён.
Редактирование root записей crontab
Редактирование записей crontab-файла другого пользователя
6. Выполнение Cron каждую минуту
В идеале, вам может и не потребоваться назначения выполнения cron каждую минуту. Но понимание этого примера поможет вам понять другие примеры, описанные в этой статье.
Указание */5 в поле минут означает каждые 5 минут. Указание 0-10/2 в поле минут означает каждые 2 минуты в первых 10 минутах. Таким образом, данная условность может быть использована во всех 4 полях.
7. Запуск фоновых задач Cron каждые 10 минут
Используйте следующее, если хотите проверять место на диске каждые 10 минут.
Эта задача выполняет указанную команду проверки диска каждые 10 минут на протяжении года. Но вам может потребоваться выполнение проверки только в рабочие часы или наоборот. Приведённые выше примеры показывают, как это сделать.
Вместо указания значений в 5 полях мы можем указать их, используя ключевое слово, как показано ниже.
Существуют особые условия, когда вместо 5 полей вы можете использовать @ и далее ключевое слово – такие как перезагрузка, полночь, ежегодно, ежечасно.
Специальные ключевые слова Cron и их значение
Ключевое слово | Эквивалент |
---|---|
@yearly | 0 0 1 1 * |
@daily | 0 0 *** |
@hourly | 0 **** |
@reboot | Запуск системы |
8. Расписание работы для первой минуты каждого года с использованием @yearly
9. Запуск задач каждый месяц с использованием ключевого слова @monthly
10. Запуск задач каждый день с использованием @daily
11. Как выполнить команду Linux после каждой перезагрузки, используя @reboot?
13. 12. Как отключить/перенаправить исходящую почту Crontab, используя ключевое слово MAIL?
По умолчанию crontab отправляет выходные (output) задачи пользователю, который установил эту задачу. Если вы хотите перенаправить их другому пользователю, добавьте или обновите переменную MAIL в crontab, как показано ниже.
Если вы хотите, чтобы почта вообще не отправлялась, т.е прекратить отправку выходных файлов crontab, добавьте или обновите переменную MAIL в crontab, как показано ниже.
13. Как выполнять задачи Linux Cron кажду секунду, используя Crontab
Вы не можете настроить выполнение cron на каждую секунду. Потому что минимальная единица выполнения cron – минута. В обычном сценарии нет необходимости запускать выполнение cron каждую секунду.
14. Указание переменной PATH в Crontab
Во всех вышеприведённых примерах мы указывали абсолютный путь команды Linux или скрипта оболочки, которые должны быть выполнены.
15. Установка Crontab из Cron-файла
Вместо прямого редактирования файла crontab вы можете добавить, все записи в cron-файл. Если в файле есть эти записи, вы можете выгрузить или установить их в cron, как показано ниже.
Как запускать задания Cron каждые 5, 10 или 15 минут
Задание cron — это задача, которая выполняется через определенные промежутки времени. Задачи можно запланировать для запуска по минуте, часу, дню месяца, месяцу, дню недели или любой их комбинации.
Запуск задания cron каждые 5, 10 или 15 минут — одни из наиболее часто используемых расписаний cron.
Синтаксис и операторы Crontab
Каждая строка в пользовательском файле crontab содержит шесть полей, разделенных пробелом, за которым следует команда, которую нужно запустить:
Первые пять полей (время и дата) также принимают следующие операторы:
Синтаксис общесистемных файлов crontab немного отличается от пользовательских файлов crontab. Он содержит дополнительное обязательное пользовательское поле, в котором указывается, какой пользователь будет запускать задание cron.
Запускать задание Cron каждые 5 минут
Есть два способа запускать задание cron каждые пять минут.
Первый вариант — использовать оператор запятой для создания списка минут:
Вышеприведенная строка синтаксически верна и будет работать нормально. Однако ввод всего списка может быть утомительным и подверженным ошибкам.
Второй вариант указать задание, которое будет запускаться каждые 5 минут часов, — это использовать оператор step:
*/5 означает создание списка всех минут и запуск задания для каждого пятого значения из списка.
Запускать задание Cron каждые 10 минут
Чтобы запускать задание cron каждые 10 минут, добавьте в файл crontab следующую строку:
Запускать задание Cron каждые 15 минут
Чтобы запускать задание cron каждые 15 минут, добавьте в файл crontab следующую строку:
Выводы
Мы показали вам, как запускать команду cron каждые 5, 10 или 15 минут.
Не стесняйтесь оставлять комментарии, если у вас есть вопросы.
Как запускать cron чаще, чем раз в минуту при помощи PHP
Классический конфиг — файл с записями cron jobs в операционной системе Linux, выглядит следующим образом:
Первые пять параметров означают время выполнения этой задачи, а шестой — сама команда, которую необходимо запустить. Параметры времени — это: минуты, часы, дни, месяцы и день недели. Причем все числа должны быть представлены в виде целых чисел либо в виде специального синтаксиса.
В итоге, минимально возможный интервал запуска команды — это один раз в минуту.
Для многих задач выполнение команды нужно намного чаще, например раз в 10 секунд. Для некоторых задач по автоматизации бизнес процессов максимально допустимая задержка часто составляет не более чем 1-1.5 секунды.
Разумеется, классический cron для этого не подходит — его нужно усовершенствовать.
Ниже представлена пошаговая реализация по созданию дополнительного функционала (на языке PHP) к классическому cron на Linux с применением дополнительной защиты от повторного запуска процессов.
Постановка задачи и настройка cron
Для примера будем использовать следующую задачу:
Итак, cron настроим в его максимальном виде, т.е. раз в минуту:
Выполнение одного цикла
Изначально следует определиться, с какой частотой мы будем запрашивать новые задачи в базе данных — в зависимости от этого будет меняться количество циклов и логический сон (функция sleep )
В текущем примере используется шаг равный 10 секундам. Следовательно количество циклов 60 / 10 = 6. Итого, общий код выглядит следующим образом:
Уточнение: в данном примере используется шаг равный 10 секундам, который может обеспечить минимальный интервал выполнения скрипта один раз в 10 секунд. Соответственно, для более частого выполнения следует изменить количество циклов и «время на сон».
Как избежать повторного выполнения задачи
В представленном виде есть одна неопределенность, а именно — повторное выполнение задачи в случае, если она уже начата. Это становится особенно актуально, если задача «сложная» и требует несколько секунд на ее реализацию.
Таким образом создается проблема повторного выполнения:
Но мы не будем нагружать базу данных: исходя из моего тестирования, MYSQL может принять запрос, но обработать его не сразу. Различие даже в 0.5 секунд может привести к повторному выполнению — что категорически не подходит.
Также в данном случае речь идет всего лишь про статусы задач, поэтому лучше будем использовать файловую систему сервера.
Основная модель проверки строится при помощи flock — функции, которая ставит и снимает блокировку с файла.
В исполнении PHP работу функции можно представить следующим образом:
Результат
Общий вид всего цикла выглядит следующим образом:
Таким образом, подобный алгоритм позволяет запускать цикличное выполнение обработки задач и не беспокоится, что задача будет обработана более одного раза.
И теперь достаточно просто запускать этот код через cron каждую минуту, а он в свою очередь, будет запускать более мелкие циклы уже внутри себя.