- Добавление PHP скрипта в cron
- Структура крон задания
- Онлайн генератор crontab для PHP скрипта
- Добавить скрипт PHP в крон
- При сохранении сокращенной версии команды, PHP может быть не найден
- HTTP сервер и команда из терминала могут запускать разные версии PHP
- HTTP сервер и команда из терминала могут запускать PHP с разными настройками
- Пользователь, от которого работает веб сервер, может отличаться от текущего.
- При запуске через терминал не установлены некоторые переменные.
- Добавление крон
- Настройка уведомлений о работе крон на электронную почту
- Настройка планировщика задач Cron в CentOS Linux
- Установка cron в Linux
- Crontab: добавление задания в планировщик cron
- Отправка уведомлений cron на e-mail
- Файлы конфигурации и логи планировщика cron
Добавление PHP скрипта в cron
Cron — это демон (программа, которая постоянно работает в системе в фоновом режиме), представляющий собой планировщик задач в UNIX-подобных операционных системах, который в определенное время автоматически выполняет задания. Пример задания — регулярное создание резервной копии.
Каждый пользователь сервера может добавлять свои задания, указывая, в какое время и какие скрипты нужно выполнять от его имени. Задания могут выполняться, например, раз в день, раз в месяц, раз в год.. На вашем хостинге могут действовать ограничения на общее количество заданий и на то, как часто может выполняться задание (Например, не чаще 1 раза в 10 минут и не более 10 cron-заданий).
Структура крон задания
Задание (таблица crontab) включает 6 разделов, разделяемых пробелами или табуляцией.
минуты часы день_месяца месяц день_недели команда
Первые пять разделов задают время выполнения скрипта:
минуты: 0-59
часы: 0-23
день месяца: 1-31
месяц: 1-12
день недели: 0-7 (0 и 7 — воскресенье)
* — диапазон с первого до последнего.
команда задает скрипт, который нужно выполнять, например, скрипт на php. Если команда передает текст в стандартный вывод, этот текст отправляется на e-mail пользователя, но стандартный вывод можно перенаправить в /dev/null:
Примеры задания времени выполнения скрипта:
0 22 * * * — каждый день в 22:00 (в 0 минут, в 22 часа, каждый день, каждый год, каждый день недели)
0 0 1 * * — раз в месяц (в 0 минут 0 часов первого числа каждого месяца)
0,30 10-22 * * * — каждые полчаса между 10:00 и 22:00 (в 0 и 30 минут с 10 до 22 часов каждый день)
*/10 * * * * — каждые 10 минут
Онлайн генератор crontab для PHP скрипта
Чтобы выбрать несколько значений из списка, зажмите Ctrl.
Добавить скрипт PHP в крон
Для начала нам нужен SSH доступ к серверу или панель Cron у вашего хостера. Настройки крон в панели у каждого хостера свои, их разбирать нет смысла.
Разберем действия через SSH.
PHP скрипты в терминале запускаются с помощью команды
Эту команду уже можно добавить в крон, но тут могут появиться проблемы
При сохранении сокращенной версии команды, PHP может быть не найден
Не стоит добавлять в крон команду php. Воспользуйтесь запуском whereis php и скопируйте полную версию команды, чаще всего это /usr/bin/php
Далее вместо команды php, лучше сразу всё проверять на полной версии. Например:
HTTP сервер и команда из терминала могут запускать разные версии PHP
Чтобы проверить, что версия одна создайте на сервере файл с контентом:
Запустите его из браузера. Увидите какую версию запускает веб сервер.
В терминале запустите команду:
Увидите версию запускаемую из терминала. Версии на сервере и из терминала должны быть одинаковые.
Если версии разные, то надо поискать команду запуска версии PHP как у веб сервера. Вам может помочь команда whereis.
Вот у нас запуск php выводит 5.6, а нам надо 7.1. Получается надо запускать /usr/local/bin/php7.1
HTTP сервер и команда из терминала могут запускать PHP с разными настройками
У разных CMS есть свои обязательные настройки. Какие настройки изменятся и как это повлияет в вашем конкретном случае — не знаю. Чтобы узнать значение настройки — используйте функцию ini_get(), чтобы в терминале указать параметр — используйте директиву -d.
Например, нам надо верно установленный часовой пояс. Контент тестового файла:
Запускаем без параметров, и с установленным часовым поясом:
Важно: если параметры у вас не верные и на веб сервере и в терминале — надо настраивать сам PHP, например через php.ini. Если проблема только при запуске через консоль — тогда можно использовать установку нужных параметров с помощью параметра -d.
Пользователь, от которого работает веб сервер, может отличаться от текущего.
Задание в крон добавляется от того пользователя, от кого вы работаете в SSH. А вебсервер может работать от другого лица.
Создайте файл с контентом:
Запустите его из браузера. Посмотрите на сервере в папке скрипта владельца файла test.txt. После этого файл test.txt удалите, запустите скрипт через консоль. Снова посмотрите владельца файла test.txt. В первом и втором случае — это должен быть один и тот же пользователь.
При запуске через терминал не установлены некоторые переменные.
Часто скрипт зависит от установки $_SERVER[‘DOCUMENT_ROOT’]. В этой переменной хранится корневая папка сайта. А когда мы запускаем скрипт через консоль — никакого сайта нет. Файл мы можем хоть откуда запускать, сайт не требуется для этого.
Чтобы решить эту проблему, в начало файла добавьте определение переменной:
Если скрипт находится в корневой папке сайта — используйте константу __DIR__, в ней папка, которой находится запускаемый файл. Если скрипт в других папках, то можно использовать относительные пути от __DIR__:
Добавление крон
С основными ошибками закончили, приступим к делу!
Чтобы запустить файл, нужен полный путь к нему. Для этого перейдите в папку с файлом, и введите команду pwd, скопируйте путь.
Как запускать php определились выше, путь к файлу есть. Попробуем запустить самостоятельно с полными путями и полной командой. Всё работает:
Берем команду и вставляем её в генератор, настраиваем время, жмем создать. Получаем строку по типу 1 1,13 * * * /usr/bin/php /var/www/myscript.php — это запуск php скрипта 2 раза в день.
Для редактирования крон заданий существует команда crontab -e. Введите её в терминале и добавьте в самый низ полученную ранее строку, сохраните.
Важно: после последнего задания должна быть одна пустая строка, иначе работать не будет. Так устроен крон.
Чтобы просмотреть список заданий, используйте команду crontab -l.
Настройка уведомлений о работе крон на электронную почту
Чтобы вывод крон задания отправлялся к вам на почту, в крон надо установить переменную MAILTO.
Чтобы отключить уведомления, MAILTO требуется установить в пустое значение.
Настройка планировщика задач Cron в CentOS Linux
21.04.2020
VyacheslavK
CentOS, Linux
Комментариев пока нет
Cron — это планировщик задач, работающий в Unix-подобных операционных системах, включая все дистрибутивы Linux. Демон cron работает на сервере в фоновом режиме и запускает по расписанию запланированные задачи. В этой статье мы рассмотрим установку cron на сервер с Linux CentOS 8, познакомимся с синтаксисом cron, научимся добавлять в него различные задачи, управлять расписанием запуска.
Установка cron в Linux
По умолчанию cron доступен при установке CentOS 8. Если же у вас по каким-то причинам он отсутствует, вы можете установить его из базового репозитория с помощью yum / dnf:
# dnf update -y — обновить все ПО на сервере
В моем случае cron уже был установлен:
После установки, демон crond нужно добавить в автозагрузку и запустить:
# systemctl enable crond.service
# systemctl start crond.service
Crontab: добавление задания в планировщик cron
Для добавления задач в cron можно использовать команду:
Данная команда откроет файл для задач для вашего пользователя в текстовом редакторе по-умолчанию (у меня это vi, но можно изменить на удобный для вас, например nano). Настройка заданий таким способом исключает, что вы допустите ошибку в синтаксисе. Редактор crontab просто не даст сохранить файл с ошибками.
Также можно отредактировать файл заданий cron вручную через mc:
# mcedit /var/spool/cron/root – имя файла может отличаться, в зависимости от того, под каким пользователем вы работаете.
Чтобы добавить простое задание по запуск bash скрипта в cron, выполните:
Теперь добавьте расписание задания и путь к файлу скрипта:
Сохраните файл (редактирование файла по аналогии с редактором vim: сохранить Ctrl+O и выйти Ctrl+x).
Если все сделали верно, ваше задание будет добавлено. Чтобы вывести список заданий cron, выполните:
Данный скрипт будет запускаться через cron ежеминутно.
Минимальное время – 1 минута. Демон cron просматривает список заданий один раз в минуту. Просматриваются следующие файлы и каталог:
/etc/crontab /etc/cron.*/. /var/spool/cron/
Каждая запись расписания crontab состоит из 5 полей:
минуты часы день_месяца месяцы день_недели
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr . # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Можно использовать следующие допустимые значения для каждого из полей:
Знак * означает все допустимые значения. Пример задания:
Указанный в задании скрипт, будет запускаться каждый понедельник в 00 часов 15 минут. Для упрощения синтаксиса cron-файла используют специальные символы:
Запятая (,) : запятой разбиваются значения расписания для выполнения одинаковой задачи, но в разное время. Например, если вам нужно выполнять задачу в 15 и 30 минут, вы можете задать расписание так:
Или исползовать более короткий синтаксис с запятой:
Слеш (/) : использовать косую черту можно для выражения какого-либо шага. Например, вам нужно запускать какую-то задачу каждые 2 часа. В обычном написании файл cron будет громоздким, используя / вы заметно сократите содержимое cron файл:
* */2 * * *
Дефис (-) : дефис указывает диапазон значений в поле. Если вы хотите запускать задание первые 10 минут или последние 10 минут, укажите диапазон через дефис:
Еще несколько примеров расписаний для cron:
- запуск по будням в 12:00 и 18:00: 0 12,18 * * 1-5
- каждые 30 минут: */30 * * * *
- каждую субботу: 0 0 * * 6
- каждый вторник и четверг в 2:00 ночи: 0 2 * * 2,4
Еще в cron можно использовать специальные переменные.
Т.е. для запуска задания раз в день можно использовать формат:
Можно отредактировать cron файл другого пользователя:
Отправка уведомлений cron на e-mail
Если вы хотите получать информацию о выполнении ваших задач cron по почте, нужно выполнить настройку cron-файла с задачами.
Для отправки почты на сервере дожен быть установлен почтовый-агент. Для теста, я установил на сервер sendmail:
# dnf install sendmail -y
# service sendmail start
sendmail – бесплатный агент для передачи почты, который доступен практически для любой операционной системе.
Настроем параметры отправки e-mail в cron-файле. Добавьте в файл следующие строки:
MAILTO="*@gmail.com" SHELL=/bin/bash HOME=/ * * * * * echo "Проверка cron"
MAILTO — укажите свой почтовый ящик
SHELL — оболочка пользователя
После каждого запуска задачи на указанный email отправляется уведомление:
Информацию о запуске задания cron можно сохранять в лог-файл. Для этого, в конце задания нужно добавить >> и указать путь до лог-файла:
* * * * * echo «Проверка cron» >> /var/log/admin/journal.log
Если в вашем cron-файле добавлено много заданий и результат выполнения каких-то из них, не нужно отправлять на почту, данные задания вы можете запускать в «бесшумном» режиме:
* * * * * echo «Проверка cron» >> /dev/null 2>&1
Таким образом вы можете отделить некоторые задания, чтобы не отправлять уведомления о всех задания себе на почтовый ящик.
Файлы конфигурации и логи планировщика cron
Основной файл конфигурации демона cron — /etc/crontab. Помимо cron-файла, задачи можно запускать из следующих директорий:
- /etc/cron.daily – запуск скриптов один раз в день
- /etc/cron.hourly – запуск скриптов ежечасно
- /etc/cron.monthly – запуск скриптов раз в месяц
- /etc/cron.weekly – запуск скриптов раз в неделю
Просто разместите нужны скрипты в нужную директорию, и они будут выполняться согласно расписания.
Можно ограничить доступ к планировщику с помощью файлов /etc/cron.allow и /etc/cron.deny. Достаточно создать эти файлы и добавить в него пользователей, которым, соотвественно, разрешено и запрещено запускать задания cron.
В файл /etc/crontab тоже можно помещать задания. Обычно данный файл используется root пользователем или для настройки системных задач. Личные файлы пользователей для cron заданий, хранятся в директории /var/spool/cron/ или /var/cron/tabs/.
Чтобы отследить выполнение задач или отследить ошибки, можно обратиться к лог-файлу /var/log/cron. В данном файле фиксируется запуск всех задач и ошибки в работе демона, если они есть:
Предыдущая статья Следующая статья