Планировщик Cron: чем полезен и как использовать в веб-разработке
Что такое Cron и как им пользоваться
Cron — программа-демон в операционных системах семейства UNIX. Она умеет выполнять задания на сервере с заданной периодичностью. Благодаря Сron веб-разработчик может упростить себе работу и автоматизировать почти любые задачи: от стандартного бэкапирования до более сложных. Я с помощью Сron проверял и убирал битые ссылки на сайте радиостанций. Немного расскажу об этом опыте, а прежде — о том, как настроить Сron вручную через консоль или в панели ispmanager, если вы не хотите хлопот с командной строкой.
Содержание
Как я наладил работу сайта радиостанций с Cron
Настройка 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-файла выглядит следующим образом:
В каждой строке шесть параметров, разделяемых пробелами.
В первых пяти параметрах задаётся время выполнения команды или сценария: минута, час, день, месяц, день недели. Допускается ввод этих значений в виде:
- числа;
- списка чисел, разделённых запятыми;
- диапазона чисел, разделённого дефисом;
- символы * или /. Знак * означает, что задание выполняться каждый раз в указанный период. Например, такое задание: * * * * * [команда для выполнения] будет выполняться каждую минуту. Чтобы настроить периодичность, например, каждые десять минут, нужно добавить к этой записи знак / и указать число: */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 в различных CMS
Во многих CMS есть уже встроенные механизмы использования Cron. Они служат для управления задачами по обслуживанию сайта и обычно уже работают из коробки. В основном их используют, чтобы проверять обновления для разных частей системы управления сайтом, будь то модули, ядро системы или поисковая индексация.
Подводные камни Cron и неприятные моменты
Бывают случаи, когда Cron может подвести и не отработать вовремя.
Например, на сервере настроено задание, которое по расписанию раз в день запускает сбор данных для последующей обработки. Данные очень важны. Но если на сервере что-то произошло в то время, когда задание должно было выполниться — не ответила нужная база данных, сервер перезагружался либо просто не работал из-за обычного сбоя электричества, — то Cron бессилен. Он не сможет отработать и пропустит запуск процесса. Это стоит учитывать: после сбоев задания нужно выполнить вручную или ждать следующего запуска по расписанию.