Запуск программ по расписанию. Использование CRON
Большинство хостеров предлагают возможность запуска программ по расписанию. Т.е. Вы можете автоматически выполнять некоторые свои программы через определенные интервалы времени. Напимер каждые 30 минут или каждый день. Это бывает очень полезно для проведения обслуживания вашего сайта. Так называемых регламентных операций, например очистка папки с временными файлами, очистка и сжатие базы данных.
Каждая строка в файле /etc/crontab имеет следующий формат:
- minute — любое целое число от 0 до 59
- hour — любое целое от 0 до 23
- day — любое целое от 1 до 31 (день должен быть корректным, если указан месяц)
- month — любое целое от 1 до 12 (или короткое название месяца, например: jan, feb и так далее)
- dayofweek — любое целое от 0 до 7, где 0 или 7 означает Воскресенье (или короткое название дня недели, например: sun, mon и так далее)
- command — команда, которая должны быть выполнена. Командой может быть как простая команда, например, ls /proc >> /tmp/proc , или команда запуска написанного вами специального сценария.
Для любых указанных выше параметров можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц во время, указанное другими параметрами.
Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.
Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.
Косая черта (/) используется для определения шага значений. Целочисленное значение может быть пропущено в диапазоне, если после диапазона указать /целое>. Например, значение минут 0-59/2, определяет, что будет пропущена каждая вторая минута. В качестве шага значений также может быть указана звёздочка. Например, значение месяца */3 определяет, что будет пропущен каждый третий месяц.
Любые строки, начинающиеся с символа решетки (#), являются комментариями, и не обрабатываются.
Как указывать путь к запускаемому через crontab файлу?
Например, 0 4 * * * путь
Маска пути: ~/public_html/cgi-bin/&
/home/w/windows/public_html/cgi-bin/&
Символ & в конце строки является необязательным элементом и указывает, что программу нужно запустить в фоновом режиме
Символ ~ обозначает путь от корня к домашнему каталогу пользователя
Проблемы с запуском программы по CRON-у
Если Вы действительно правильно указали путь, проверьте формат файла скрипта. Скрипты, запускаемые через crontab, должны быть сохранены в формате Unix. Речь идет о формате конца строки. Он должен быть таким, как принято в системах Unix — LF (вместо CRLF, использующегося в DOS и Windows или CR в системах Macintosh).
В первой строке PHP файла, запускаемого по Cron-у обязательно указание пути до интерпретатора PHP:
Или укажите команду для cronа php путь до файла или GET ссылка на файл.
Еще одна проблема, по которой может не выполняться PHP скритпт по крону, это неверные атрибуты файла. Установите флаг выполнения -rwxr-xr-x
Примеры cron заданий
0 */3 * * 2,5 /home/u12345/script.php — скрипт /home/u12345/script.php будет автоматически запускаться каждые три часа во вторник и в пятницу;
0 * * * * /home/u12345/script.php — выполнять задание каждый час в 0 минут;
0 */3 * * * /home/u12345/script.php — выполнять задание каждые три часа в 0 минут;
15 1 * * 1 /home/u12345/script.php — выполнять задание по понедельникам в 1 час 15 минут ночи;
1 0 5 4 * /home/u12345/script.php — выполнять задание 5 апреля в 0 часов 1 минуту каждый год;
13 13 13 * 5 /home/u12345/script.php — выполнять задание в пятницу 13 числа в 13 часов 13 минут;
10 6 1 * * /home/u12345/script.php — выполнять задание ежемесячно 1 числа в 6 часов 10 минут;
30 3 * * mon hello — выполнять команду hello каждый понедельник в 3:30;
10 4 1 * * hello — выполнять команду hello в первый день каждого месяца в 4:10;
5 0 * * * $HOME/bin/daily.job >> $HOME/log/daily 2>&1 — выполнять задание каждый день в 0 часов 5 минут, результат складывать в log/daily;
0 22 * * 1-5 echo «Пора домой» | mail -s «Уже 22:00» john — выполнять задание каждый рабочий день в 22:00;
23 */2 * * * echo «Выполняется в 0:23, 2:23, 4:23 и т. д.» ;
5 4 * * sun echo «Выполняется в 4:05 в воскресенье» ;
0 0 1 1 * echo «С новым годом!» ;
15 10,13 * * 1,4 echo «Эта надпись выводится в понедельник и четверг в 10:15 и 13:15» ;
0-59 * * * * echo «Выполняется ежеминутно» ;
*/5 * * * * echo «Прошло пять минут» — каждые 5 минут.
Т.к. при запуске по cron-у php программы не будут определены системные перемнные такие, как $_SERVER, вы можете использовать мой прием, который позволит Вам не мучаться с отладкой таких CRON-скриптов. Вставьте в самое начало php скрипта следующий код:
if(empty($_SERVER['DOCUMENT_ROOT']))$_SERVER['DOCUMENT_ROOT']=dirname(dirname(__FILE__)); if(empty($_SERVER['HTTP_HOST']))$_SERVER['HTTP_HOST']='htmlweb.ru'; if(!isset($_SERVER['REMOTE_ADDR'])||!$_SERVER['REMOTE_ADDR'])$_SERVER['REMOTE_ADDR']='127.0.0.1'; if(!isset($_SERVER['REQUEST_URI'])||!$_SERVER['REQUEST_URI'])$_SERVER['REQUEST_URI']='/cron.php';
Планировщик Cron: чем полезен и как использовать в веб-разработке
Cron — программа-демон в операционных системах семейства UNIX. Она умеет выполнять задания на сервере с заданной периодичностью. Благодаря Сron веб-разработчик может упростить себе работу и автоматизировать почти любые задачи: от стандартного бэкапирования до более сложных. Я с помощью Сron проверял и убирал битые ссылки на сайте радиостанций. Немного расскажу об этом опыте, а прежде — о том, как настроить Сron вручную через консоль или в панели ISPmanager, если вы не хотите хлопот с командной строкой.
Настройка 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 дней.
Нас читает уже более 35 000 человек
Подпишитесь и получите скидку 10% на ispmanager!
Выбирайте интересное вам: новости ispmanager, подборка статей для начинающих веб-специалистов, всё для матёрых разработчиков или предложите свой вариант рассылки
Благодарим за интерес к рассылке от ispmanager!
На ваш почтовый адрес: отправлено письмо с просьбой подтвердить свой email.
Сразу после подтверждения почтового адреса мы вышлем вам обещанную скидку за подписку.
*Если вы не получили письмо, пожалуйста, проверьте правильно ли был указан почтовый адрес и попробуйте заполнить форму еще раз.
Что такое Cron.php и для чего он нужен
Сron.php — это скрипт позволяющий настроить выполнение определенных действий в системе по расписанию без участия администратора сайта.
Настройка выполнения Cron.php
Алгоритм настройки выполнения Cron.php зависит от используемого хостинга.
Обычно в админке хостинга есть раздел с названием «Планировщик заданий» или «Управление Crontab» в котором и выполняется настройка.
Запускать Cron.php можно командой
wget http://ваш_сайт/cron.php
но иногда на хостинге есть и другие варианты запуска, поэтому лучше ознакомиться с документацией хостинга по данному вопросу либо уточнить его в техподдержке хостинга.
О различных вариантах запуска Cron.php описано в нашей документации:
Системные функции Сron.php в модулях
Тут перечислены системные модули и функции в них которые могут выполняться при запуске Cron.php.
При необходимости вы можете добавить свои функции, которые будут выполняться по расписанию, например:
Интеренет-магазин (emarket)
onCronSyncCurrency — Синхронизирует курсы валют с цб
onCronCheckExpiredCustomers — Удаляют «просроченные» объекты незарегистрированных покупателей
onCronCheckExpiredOrders — Удаляют «просроченные» объекты незавершенных заказов
onCronCheckExpiredCustomersOneClick — Удаляют «просроченные» объекты незавершенных заказов в 1 клик
Резервирование (backup)
onCronCleanChangesHistory — Очищает историю изменений модуля «Резервирование» в соответствии с настройками времени хранения событий
Конфигурация (config)
maintainDataBaseCache — Выполняет операции по обслуживанию кеширования через базу данных
runGarbageCollector — Запускает системный сборщик мусора(в частности устаревшие файлы файлового кэша и мусор в БД);
Структура (content)
cronSendNotification — Проверяет необходимость послать уведомление об окончании срока публикации, и, соответственно, посылка таковых;
cronUnpublishPage — Проверяет окончание срока публикации и деактивация таких объектов;
Новости (news)
feedsImportListener — Импортирует все фиды RSS.
cronActivateNews — Активирует новости с подходящей датой публикации
Каталог (catalog)
reIndexOnCron — Выполняет переиндексацию фильтров разделов каталога
Рассылки (dispatches)
onAutosendDispathes — Выполняет отправку запланированных рассылок
CRON – запуск php скрипта по расписанию

В панели управления ISPManager в разделе«Инструменты» — «Планировщик (cron)»добавьте задание (выберите Период, Минуты, Часы, Дни ..):
/usr/bin/wget -O /dev/null «http://ваш_домен/путь_к_вашему_скрипту»
(пример: /usr/bin/wget -O /dev/null «https://abcname.net/cron/cron.php»)
wget -q -O — https://abcname.net/tpl/templates_importonec/ >/dev/null 2>&1
/usr/bin/php /var/www/ваш_логин/data/www/имя_домена/путь_файлу
(пример: /usr/bin/php /var/www/superuser/data/www/abcname.net /cron/cron.php)
