Планирование задач с помощью CRON
Пожалуй, основной задачей веб-программистов является создание и обслуживание пользовательского интерфейса. Иными словами, на создаваемых ими (нами) сайтах посетители нажимают на кнопки, вводят данные, а сайты должны реагировать на это какими-то действиями. Но есть такие вещи, которые разработчики должны уметь делать на сайтах вне обычного потока веб-запросов
Например, мы должны запускать наши резервные копии по крайней мере раз в день, у нас должно быть что-то, автоматически применяющее наши системные обновления, и мы захотим отправить электронное письмо пользователям, которые давно не входили в систему, приглашая их вернуться. Причем все это должно выполняться либо по расписанию, либо через определенные промежутки времени.
Система cron, установленная почти в каждой операционной системе на базе Unix, обеспечивает решение этой проблемы. В этой статье мы обсудим, что cron может сделать для нас, как создать базовое задание по расписанию и некоторые более сложные темы, связанные с cron.
Что Cron может сделать для нас
В системном администрировании Unix система cron является бесценным инструментом для планирования и автоматизации задач. Cron - это основанный на времени планировщик заданий в Unix. Он позволяет пользователям планировать выполнение команд или сценариев в определенное время или с интервалами.
Система cron состоит из двух основных компонентов: демона cron (crond) и таблицы CRON (crontab). Демон cron непрерывно работает в фоновом режиме и выполняет запланированные задачи, в то время как таблица cron содержит список задач и информацию об их планировании.
Как создать задание Cron
Каждый пользователь в системе Unix может иметь свой файл crontab.
Чтобы создавать или изменять задания cron, вам необходимо работать с командой crontab. Я должен сказать, что могут быть различия в том, как работает моя команда crontab, по сравнению с тем, как работает ваша crontab.
Для начала мы проверим, что в данный момент находится в нашей crontab, запустив crontab -l
$ crontab -l crontab: no crontab for rootВ данном случае у нас ничего нет.
Теперь, чтобы создать или отредактировать crontab, мы запустим crontab -e
$ crontab -e crontab: no crontab for root - using an empty oneЭто должно запустить в редактор вашего терминала по умолчанию. У меня это vim.
Если вам не хочется набирать текст прямо в консоли (это действительно иногда не очень удобно), то можно создать текстовый файл с любым названием, отредактировать его и залить в папку /etc/cron.d – крон подхватит его автоматически. Подробнее я расскажу об этом ниже.
Каждая строка файла будет уникальной записью cron, и каждая запись cron состоит из шести полей, которые определяют, когда и как должна выполняться задача.
Для начала мы воспользуемся супер простым примером, который будет состоять в том, чтобы ввести 5 звездочек, а затем команду для запуска даты и добавления результатов в файл “cron.log” в домашнем каталоге текущего пользователя.
* * * * * date >> ~/cron.logЭто приведет к запуску команды date каждую минуту.
Сохраните файл и выйдите из редактора (:qw в vim), и вы должны увидеть следующее сообщение:
crontab: installing new crontabЧтобы проверить нашу crontab, мы можем запустить crontab с аргументом -l, чтобы в нем было перечислено содержимое.
$ crontab -l * * * * * дата >> ~/cron.logТеперь давайте посмотрим на наши результаты. Мы можем использовать команду tail с аргументом -f, чтобы увидеть выходные данные нашего задания cron в режиме реального времени.
$ tail -f ~/cron.log Tue Jul 4 12:55:00 EDT 2023 Tue Jul 4 12:56:00 EDT 2023Я не хочу, чтобы это работало вечно, поэтому я сброшу свой crontab, используя переключатель командной строки -r. Будьте осторожны с этим, так как он удаляет вашу crontab без запроса, чтобы убедиться, что это то, что вы хотите.
crontab -rПросто чтобы завершить наш обзор команды crontab, есть еще один параметр, который важно обсудить, и это аргумент -u, который позволит нам редактировать чужой файл crontab.
Например, чтобы отредактировать пользовательский файл www-data, мы бы запустили:
sudo crontab -e -uwww-dataКак запланировать задания Cron
Мы выполнили самую простую работу cron, чтобы начать работу, но cron более эффективен, чем просто выполнение одной и той же задачи каждую минуту. Я умолчал о значении пяти звездочек в задании, которое мы создали, но эти пять звездочек - это пять полей, которые определяют, когда должно выполняться наше задание.
Поля управляют:
- Минута (0-59)
- Час (0-23)
- День месяца (1-31)
- Месяц (1-12)
- День недели (0-7, где и 0, и 7 по какой-то причине означают воскресенье)
Давайте разберем несколько примеров.
Чтобы запускать команду каждый день в 7:00 утра, мы бы поставили 0 в поле минут, 7 в поле часов и звездочки во всех остальных полях.
0 7 * * * date >> ~/cron.logЧтобы запускать команду каждые 15 минут, мы бы использовали косую черту звездочки 15, а затем звездочки в остальных четырех полях.
*/15 * * * * date >> ~/cron.logЧтобы запускать скрипт каждый понедельник в 8:00 вечера, мы бы поставили 1 в поле "День недели".
0 20 * * 1 date >> ~/cron.logПродлите это до понедельника и среды, и мы доведем это значение до 1,3
0 20 * * 1,3 date >> ~/cron.logЧтобы запускать команду 1-го и 15-го числа каждого месяца в полночь, мы введем 1,15 в поле день месяца и 0 для часов и минут, а также звездочки для последних двух полей.
0 0 1,15 * * date >> ~/cron.logНаконец, для запуска каждого 1 января в полночь мы снова установим 0 в часах и минутах и 1 в полях месяц и день месяца.
0 0 1 1 * date >> ~/cron.logCron системного уровня
Помимо того факта, что у каждого пользователя есть свой crontab, существует также общесистемный файл crontab, который обычно находится по адресу /etc/crontab. Именно сюда мне нравится помещать все мои задания cron, которые не связаны с конкретным пользователем и вместо этого являются чем-то, что должно выполняться на системном уровне, например, резервное копирование.
Чтобы внести изменения в этот crontab, мы отредактируем файл непосредственно с помощью vim /etc/crontab.
В этом файле есть дополнительное поле, указывающее пользователя, от имени которого должна выполняться команда. Это действует так же, как если бы пользователь вошел в систему, поэтому команда получит те же разрешения. Я настоятельно рекомендую вам НЕ запускать команду от имени root, если вы можете предотвратить это, но иногда это неизбежно.
# m h dom mon dow user command 1 45 * * 1 root certbot renewSystemd
В некоторых версиях Unix новая система начинает заменять cron под названием systemd. Он делает намного больше, чем cron, и значительно мощнее, но он не так широко распространен и не всегда доступен, если вы используете какой-либо шаред хостинг.Возможно, что я расскажу об этом в следующей статье.
Управление вашими заданиями Cron
Как разработчик приложений, вы можете столкнуться с проблемой управления всеми вашими заданиями cron в одном файле. Однажды я управлял приложением, в котором было более 50 запланированных заданий, которые мы поддерживали с помощью cron. Поскольку экспертная проверка этого файла не проводилась, время от времени кто-нибудь случайно удалял одно из заданий, и оно завершалось неудачей, пока кто-нибудь не замечал этого. Обычно это был клиент, спрашивающий, почему он чего-то не получил, что заставляло нас разобраться в этом.
Есть два решения этой проблемы.
Во-первых, вы можете управлять своим файлом crontab внутри своего исходного кода, используя что-то простое, например, простое копирование файла на сервер, или использовать что-то немного более сложное, например Ansible, Puppet или Docker. Это приемлемое решение, но оно немного усложняет наше развертывание, и мне не нравится это делать.
Второе решение заключается в управлении вашими заданиями внутри вашего приложения. У вас может быть одно задание cron, к которому вам не нужно прикасаться, а затем настроить запланированные задания с помощью кода вашего приложения. Это подход, который использует Laravel, и он может быть очень эффективным, поскольку нам предоставляется дополнительный контроль над тем, как и где будут выполняться задания.
Что вам нужно знать
- Cron - это Unix-инструмент для планирования и автоматизации задач
- Используйте команду crontab для изменения
- Используйте код приложения для управления заданиями для получения большего контроля
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.