19 апреля 2022 Время чтения: 4 минуты

Дмитрий Древко

Веб-разработчик

Планировщик Cron: чем полезен и как использовать в веб-разработке

ISPmanager

Что такое Cron и как им пользоваться

 

Cron — программа-демон в операционных системах семейства UNIX. Она умеет выполнять задания на сервере с заданной периодичностью. Благодаря Сron веб-разработчик может упростить себе работу и автоматизировать почти любые задачи: от стандартного бэкапирования до более сложных. Я с помощью Сron проверял и убирал битые ссылки на сайте радиостанций. Немного расскажу об этом опыте, а прежде — о том, как настроить Сron вручную через консоль или в панели ISPmanager, если вы не хотите хлопот с командной строкой.

Настройка Cron вручную в консоли

 

Расписание работы Cron задаётся инструкциями в файлах crontab. В них указано, какие команды и в какое время должен выполнить сервер.

 

Сrontab-файлы создаются для каждого пользователя индивидуально в каталоге /var/spool/cron/crontabs/"< имя пользователя >". Подробное описание crontab есть в официальной документации, а я расскажу об основных командах.

 

Чтобы внести в crontabs информацию, используется команда crontab -e. Она открывает содержимое crontab-файла для редактирования. Выполнение этой команды не прерывает работу Сron — все процессы, записанные в открытом crontab, будут выполняться по расписанию.

 

Основные команды для работы с Cron:

  • crontab -l выводит на экран содержимое текущего файла расписания активного пользователя — того, кто в данный момент авторизован в системе;
  • crontab -r удаляет текущий файл расписания;
  • crontab – e выводит на экран содержимого текущего файла расписания для редактирования.

 

Чтобы добавить в crontab новую задачу, нужно прописать в crontab строку, в которой указано время выполнения команды и сама команда или ссылка на скрипт, который нужно выполнить.

 

Структура одной строки crontab-файла выглядит следующим образом:

Структура одной строки crontab-файла

В каждой строке шесть параметров, разделяемых пробелами.

В первых пяти параметрах задаётся время выполнения команды или сценария: минута, час, день, месяц, день недели. Допускается ввод этих значений в виде:

  • числа;
  • списка чисел, разделённых запятыми;
  • диапазона чисел, разделённого дефисом;
  • символы * или /. Знак * означает, что задание выполняться каждый раз в указанный период. Например, такое задание: * * * * * [команда для выполнения] будет выполняться каждую минуту. Чтобы настроить периодичность, например, каждые десять минут, нужно добавить к этой записи знак / и указать число: */10 * * * * [команда для выполнения] — запуск задания каждые 10 минут.

 

Время и дата для выполнения берётся относительно времени и даты, установленными на сервере, где выполняется задание Cron.

 

Шестым параметром задаётся команда для выполнения.

 

Для ручного создания команд Cron существуют сервисы crontab-генераторов. Они упрощают жизнь начинающим пользователям:

  • crontab.guru — хороший ресурс для тех, кто ещё мало знаком с планировщиком. Здесь можно изучать синтаксис команд и примеры cron-задач.
  • crontab-generator.org— генератор команд. Достаточно ввести нужные данные в форму, и сайт сгенерирует команду для планировщика. Её можно вставить в crontab-файл, открыв её командной crontab -e, либо сохранить в файл или вообще отправить на e-mail.

 

Если же вы пользуетесь ISPmanager, вводить команды в crontab вовсе не нужно — их можно задать через форму прямо в панели. Расскажу об этом способе работы с Cron.

 

Несколько примеров использования Cron в ISPmanager

ISPmanager — панель для управления веб-серверами и сайтами. В неё уже включен инструмент для работы с Cron. Чтобы запланировать задачи на сервере, не нужно открывать терминал — управление происходит через формы и кнопки в панели.

 

Пример стандартного содержимого файла crontab пользователя root в ISPmanager:

[[php]] ## ISPmanager acme.sh certs update task 48 3 * * * /usr/local/mgr5/sbin/cron-core sbin/mgrctl -m core [[/php]]

В первой строке указано описание задачи: ## ISPmanager acme.sh certs update task.

 

Во второй строке указано, что каждый день в 3 часа 48 минут команда /usr/local/mgr5/sbin/cron-core sbin/mgrctl будет выполнена с параметрами -m core acmesh.certs.update. Надпись >/dev/null 2>&1 означает, что отчёт о выполнении команды не будет отправлен на почту пользователя.

 

Команда выполняется каждые 5 минут:

[[php]] ## ISPmanager task which collect system statistics */5 * * * * /usr/local/mgr5/sbin/cron-core sbin/mgrctl -m core sysinfostat >/dev/null 2>&1[[/php]]

 

Чтобы не прописывать в crontab-файле все эти команды вручную, можно зайти в ISPmanager в раздел Планировщик и отредактировать уже существующее задание, либо создать новое:

Так выглядит раздел со всеми созданными задачами планировщика

Как я наладил работу сайта радиостанций с Cron

 

Мне довелось использовать Cron для автоматизации проверки доступности многих интернет-ресурсов.

 

Работая в веб-студии, мы разрабатывали сайт-агрегатор радиостанций. Сайт представлял из себя набор ссылок на потоковые аудио вещающих интернет-радиостанций.

 

Время от времени радиостанции прекращали вещание на неопределённый срок. Из-за этого на сайте появлялись битые неработающие ссылки. Нужно было круглосуточно проверять их раз в два или три часа. Для этого сервер сайта обращался по каждой ссылке и проверял пришедший в ответ код. Если он получал код 200, значит всё в порядке, и ссылка работает. Все остальные коды означают, что ссылка нерабочая. Такую радиостанцию с сайта-агрегатора нужно убирать и не показывать посетителям до тех пор, пока ссылка вновь не станет возвращать код 200.

 

Чтобы избавиться от ручной проверки порядка семи сотен ссылок, я использовал Cron. Написал скрипт на PHP, который проверял доступность ссылок на аудиопотоки, и запускал его каждые два часа. Команда выглядела так:

[[php]] * */2 * * * php check-radios.php >/dev/null 2>&1[[/php]]

 

Я добавил её в Сron через установленный ISPmanager. В типе выполнения задания выбрал Экспертный режим — в нём можно задавать не только конкретное время, день, день недели и месяц, но и периодичность:

Интерфейс создания и редактирования задания в планировщике Cron в панели ISPmanager

После этого созданная задача появилась в разделе Планировщик со всеми заданными параметрами:

Только что созданная с помощью ISPmanager задача в планировщике

Использование Cron в различных CMS

 

Во многих CMS есть уже встроенные механизмы использования Cron. Они служат для управления задачами по обслуживанию сайта и обычно уже работают из коробки. В основном их используют, чтобы проверять обновления для разных частей системы управления сайтом, будь то модули, ядро системы или поисковая индексация.

 

Подводные камни Cron и неприятные моменты

 

Бывают случаи, когда Cron может подвести и не отработать вовремя.

 

Например, на сервере настроено задание, которое по расписанию раз в день запускает сбор данных для последующей обработки. Данные очень важны. Но если на сервере что-то произошло в то время, когда задание должно было выполниться — не ответила нужная база данных, сервер перезагружался либо просто не работал из-за обычного сбоя электричества, — то Cron бессилен. Он не сможет отработать и пропустит запуск процесса. Это стоит учитывать: после сбоев задания нужно выполнить вручную или ждать следующего запуска по расписанию.

ISPmanager для управления сайтами и веб-серверами

 

ISPmanager помогает создавать и администрировать сайты: настраивать среду разработки, автоматизировать DevOps — задачи, делать бэкапы, устанавливать версии PHP, пакеты языков программирования, многое другое. Попробуйте бесплатную версию ISPmanager на 14 дней.