Планирование задач с помощью 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.log
Cron системного уровня

Помимо того факта, что у каждого пользователя есть свой crontab, существует также общесистемный файл crontab, который обычно находится по адресу /etc/crontab. Именно сюда мне нравится помещать все мои задания cron, которые не связаны с конкретным пользователем и вместо этого являются чем-то, что должно выполняться на системном уровне, например, резервное копирование.

Чтобы внести изменения в этот crontab, мы отредактируем файл непосредственно с помощью vim /etc/crontab.

В этом файле есть дополнительное поле, указывающее пользователя, от имени которого должна выполняться команда. Это действует так же, как если бы пользователь вошел в систему, поэтому команда получит те же разрешения. Я настоятельно рекомендую вам НЕ запускать команду от имени root, если вы можете предотвратить это, но иногда это неизбежно.

# m h dom mon dow user  command
1 45 * * 1 root certbot renew
Systemd

В некоторых версиях 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, cron, linux, unix, системное администрирование




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Простая реализация алгоритма быстрого поиска на Java
Логи и ошибки
Введение в скрипты Postman