0

Запуск скрипта по крону

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

Задания в Cron и запуск PHP-скрипта

Сама запись (задание) в Cron (чаще по имени папки crontab или crontabs) состоит из временной метки и команды. Временная метка задания включает в себя значения: день недели, месяц, день, час и минута, а команда (часто называется: задание) , по крайне мере в случае с запуском скрипта, может состоять из интерпретатора и самого срипта, например:

В данном случае: `/usr/bin/which php` – абсолютный путь до интерпретатора PHP, а /home/l/login/public_html/script.php – абсолютный путь до php-скрипта. Примечательно, что путь к интерпретатору и скриптам у вас могут отличаться, т. к. зависят от настроек веб-сервера.

Настройка Cron через ПУ

Большинство хостинг-пройвайдеров предоставляет клиентам специальную панель управления (ПУ) хостингом, что облегчает настройку и работу с записями Cron. Вот как выглядит запуск php-скрипта cron_admitad.php в планировщике на SpaceWeb.

Настройка Cron и запуск PHP-скрипта

Обратите внимание — путь к интерпретатору здесь не указан (об этом чуть позже) . Также следует отметить использование символа «тильда» (

) в качестве псевдонима «домашнего каталога» (с учетом приведенного примера: /home/l/login ) . Если проще, то это тот каталог, в который, при обычных условиях, вы изначально попадаете по FTP.

Путь к интерпретатору в php-срипте

Большинство задач имеет множество решений. Зачастую сложно сказать какое из них оптимально, но речь не об этом.

Символ «решетка» ( # ) в PHP является комментарием, но последовательность #! (англ. bang line, hash-bang или she-bang) имеет специальное значение – она указывает путь к интерпретатору скрипта.

Дело в том, что в UNIX-подобных операционных системах скрипты могут создаваться на разных языках: PHP, Perl, Python и т. д. Когда скрипт выполняется веб-сервером, он ориентируется на расширение файла (например: .php , .phtm , phtml и т. д. – это обычные расширения для PHP интерпретатора) . UNIX-подобные операционные системы на расширение файла, как правило, не ориентируются – его зачастую у файла просто нет. Система считывает первую строку и ищет обработчик скрипта.

В ранее упомянутом php-срипте, первой строкой у меня идёт запись:

Опять же, путь к интерпретатору PHP у вас может отличаться от указанного пути в примере, т. к. всё зависит от настроек веб-сервера.

Пути к файлам в скрипте, запускаемом через Cron

Ещё один немаловажный нюанс. Если в скрипте используются функции require() , include() , fopen() и т. д., подразумевающие обращение к сторонним файлам на веб-сервере, вам нужно указать абсолютный путь, например:

Опять же, путь к файлу coupons.db у вас может отличаться от указанного пути в примере, т. к. всё зависит от настроек веб-сервера.

В целом, можно использовать и относительный путь. Для этого воспользуйтесь php-функцией chdir() , которая меняет текущий каталог PHP, на указный в качестве её параметра.

Честно говоря, я не использовал эту функцию, но как понимаю, дело обстоит следующим образом. Перед обращением к стороннему файлу на веб-сервере, вставляется что-то вроде следующего кода:

Таким образом, файл, с учётом приведенного примера, будет доступен по относительному пути:

Точка в начале означает текущий, изменённый каталог.

Подведём итоги настройки Cron

Cron (часто называется по имени папки crontab или crontabs) – программа планировщик запущенная на веб-сервере хостинг-проваqдера, которая выполняет запуск скриптов, программ и др. команд в определенный момент времени. Само задание представляет собой запись состоящую из временной метки и команды. Важным моментом здесь является указание правильных путей к интерпретатору скрипта и подключаемым в нём файлам.

Короткая ссылка: http://goo.gl/JXVVV2

Интересно, а чем можно запускать сценарий чаще, чем раз в минуту? Например, мой сценарий проверяет страницы на индексацию. И если я проверяю по крону 10 000 страниц (по 1 странице за раз), то они будут проверяться 7 дней.

30 ноября 2013 г., 4:41 Удалить комментарий

По всей видимости, здесь всё зависит от мощностей и лимитов сервера, а чем м как именно запускать скрипт не столь уж и принципиально. На мой взгляд, для обработки большого объема данных лучше использовать многопоточность, основанную на работе нескольких серверов, которые сливали бы конечный результат в одну базу, если такое нужно. Каждая задача имеет множество вариантов решения и лучше рассматривать конкретный случай. имхо.

30 ноября 2013 г., 5:55 Удалить комментарий

У меня конкретно виртуальный сервер, один единственный. Я могу написать десктопную софтину, которая будет делать запросы к скрипту каждые 5 секунд, чтобы нужная мне проверка выполнилась в 20 раз быстрее. Но, думаю, под линукс можно написать такую же софтину, которая будет работать в фоновом режиме. Хотелось бы узнать, случалось ли вам видеть нечто подобное?

30 ноября 2013 г., 14:26 Удалить комментарий

Мне не доводилось заниматься масштабными проектами, а для решения чего-то подобного я тупо использовал генератор запросов на PHP, с применением AJAX. он то всё делает по мере возможности 🙂 просто и не претенциозно.

30 ноября 2013 г., 15:11 Удалить комментарий

Вот хак для задач с периодичностью меньше минуты – http://plutov.by/post/cron_every_30_sec

24 июня 2014 г., 23:58 Удалить комментарий

Читайте также:  Видеокарта nvidia geforce gt730

2plutov.by ну, разве что если увеличить время выполнения скрипта, а так оно оборвет просто его действие. имхо.

25 июня 2014 г., 0:41 Удалить комментарий

Обычно в CLI режиме нет ограничения времени или же оно точно больше минуты. Да и пример по ссылке как раз таки про обратное решение

Системным администраторам, да и обычным пользователям часто приходится автоматизировать различные задачи по обслуживанию и работе с Linux с помощью скриптов. Это очень удобно, вы просто запускаете скрипт, и он делает все что необходимо без вашего вмешательства. Следующий шаг в этом пути – настроить автоматически запуск нужного скрипта в нужное время.

Именно для этих задач в Linux используется системный сервис cron. Это планировщик, который позволяет выполнять нужные вам скрипты раз в час, раз в день, неделю или месяц, а также в любое заданное вами время или через любой интервал. Программа часто используется даже другими службами операционной системы. В этой статье мы рассмотрим как выполняется настройка Cron и разберем основные часто используемые примеры.

Как работает Cron?

Фактически, Cron – это сервис, как и большинство других сервисов Linux, он запускается при старте системы и работает в фоновом режиме. Его основная задача выполнять нужные процессы в нужное время. Существует несколько конфигурационных файлов, из которых он берет информацию о том что и когда нужно выполнять. Сервис открывает файл /etc/crontab, в котором указаны все нужные данные. Часто, в современных дистрибутивах там прописан запуск утилиты run-parts, которая запускает нужные скрипты из следующих папок:

  • /etc/cron.minutely – каждую минуту;
  • /etc/cron.hourly – каждый час;
  • /etc/cron.daily – каждый день;
  • /etc/cron.weekly – каждую неделю;
  • /etc/cron.monthly – каждый месяц.

В этих папках должны находиться скрипты, которые нужно выполнять с указанным интервалом. Скрипты должны иметь права на выполнение и их имя не должно содержать точки. Это очень сильно облегчает работу с планировщиком для новых пользователей. Также в файле crontab прописан запуск команды anacron, которая работает так же как и cron, только предназначена для задач, которые нужно выполнять раз в длительный период, например, раз в день, неделю, месяц, год.

Она позволяет выполнять их даже если компьютер работает не всегда и время от времени выключается. Дата выполнения задания последний раз записывается в файл /var/spool/anacron, а затем, при следующем запуске anacron проверяет был ли запущен нужный процесс в нужное время, и если нет, то запускает его. Сам же сервис cron больше рассчитан на выполнение задач в течение дня или с точно расписанным временем и датой.

Настройка Cron

Для настройки времени, даты и интервала когда нужно выполнять задание используется специальный синтаксис файла cron и специальная команда. Конечно, вы всегда можете отредактировать файл /etc/crontab, но этого делать не рекомендуется. Вместо этого, есть команда crontab:

Ее всегда желательно выполнять с опцией -e, тогда для редактирования правил будет использован ваш текстовый редактор по умолчанию. Команда открывает вам временный файл, в котором уже представлены все текущие правила cron и вы можете добавить новые. После завершения работы команды cron файл будет обработан и все правила будут добавлены в /var/spool/cron/crontabs/имя_пользователя причем добавленные процессы будут запускаться именно от того пользователя, от которого вы их добавляли.

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

Синтаксис crontab

Как я уже говорил, время задается особым синтаксисом, давайте рассмотрим синтаксис настройки одной задачи cron:

минута час день месяц день_недели /путь/к/исполняемому/файлу

Нужно сказать, что обязательно нужно писать полный путь к команде, потому что для команд, запускаемых от имени cron переменная среды PATH будет отличаться, и сервис просто не сможет найти вашу команду. Это вторая самая распространенная причина проблем с Cron. Дата и время указываются с помощью цифр или символа ‘*’. Этот символ означает, что нужно выполнять каждый раз, если в первом поле – то каждую минуту и так далее. Ну а теперь перейдем к примерам.

Примеры настройки cron

Сначала можно посмотреть задачи cron для суперпользователя, для этого можно воспользоваться опцией -l:

Вы можете удалить все существующие задачи командой -r:

Давайте предположим, что нам нужно запускать от имени суперпользователя наш скрипт по адресу /usr/local/bin/serve. Какой-нибудь обслуживающий скрипт. Самый простой пример – запускать его каждую минуту:

Далее, усложним, будем запускать каждый час, в нулевую минуту:

Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:

0 0 * * * /usr/local/bin/serve

Если идти так дальше, то можно запускать в первый день каждого месяца:

0 0 1 * * /usr/local/bin/serve

Можно в любой день, например, 15 числа:

0 0 15 * * /usr/local/bin/serve

В первый день недели первого месяца года, 0 часов 0 минут:

0 0 * 1 0 /usr/local/bin/serve

Или в нулевой день недели каждого месяца:

0 0 * * 0 /usr/local/bin/serve

Вы можете выбрать любую минуту, час и день недели, например, 15.30 во вторник:

30 15 * * 2 /usr/local/bin/serve

Понедельник считается первым днем, воскресенье – это седьмой или нулевой день. Еще можно писать сокращенное название дня недели, например sun – воскресенье:

30 15 * * sun /usr/local/bin/serve

Для того чтобы указать определенный интервал нужно использовать символ "-", например, каждый час, с семи утра до семи вечера:

0 7-19 * * * /usr/local/bin/serve

Если нужно запустить команду несколько раз, можно использовать разделитель ",". Например, запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:

5,35 16 * * * /usr/local/bin/serve

Вы можете захотеть не указывать отдельно время, а просто указать интервал, с которым нужно запускать скрипт, например, раз в 10 минут. Для этого используется разделитель косая черта – "/":

Кроме того, для некоторых часто используемых наборов были придуманы переменные, вот они:

  • @reboot – при загрузке, только один раз;
  • @yearly, @annually – раз год;
  • @monthly – раз в месяц;
  • @weekly – раз в неделю;
  • @daily, @midnight – каждый день;
  • @hourly – каждый час.

Например, вот так просто будет выглядеть команда запуска скрипта раз в час:

Читайте также:  Гто регистрация для школьников официальный сайт сочи

Если же вы собрались добавить скрипт в одну из папок, то, как я уже говорил, нужно чтобы его имя было без точек и у него были права на выполнение:

sudo vi /etc/corn.daily/basckup

Скрипт должен выглядеть подобным образом. Теперь вы знаете как настроить cron, осталось проверить как все работает.

Отладка работы

После того как вы настроили правила, еще хотелось бы проверить работают ли они. Для этого ждем того времени, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron, а иногда пишется в syslog. Например, у меня в crontab есть такая строка:

Она должна выполняться в 19.40 каждый день, теперь смотрим лог:

grep CRON /var/log/syslog

И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут же было бы выведено сообщение.

Если нужно проверить скрипт, который находится в одной из специализированных папок, то тут еще проще, просто запустите run-paths, передав ей в параметр нужную папку или даже сам скрипт:

sudo run-paths /etc/cron.daily/

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

Выводы

В этой статье мы рассмотрели как выполняется настройка cron для удобного планирования автоматических задач. Надеюсь, эта информация была полезной для вас.

Нет похожих записей

Оцените статью:

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux интересуюсь всем, что связано с информационными технологиями и современной наукой.

11 комментариев

опечатка в слове cron sudo vi /etc/corn.daily/basckup

Здесь тоже опечатка sudo run-paths /etc/cron.daily/
Нужно run-parts

Может подскажет кто, в чём проблема? Есть скрипт, который содержит команду badblocks. Запускается в ручном режиме и нормально отрабатывает. Загоняю его в crontab -e 30 12 * * * /programs/scripts/badblocks.sh он запускается, но потом пишет sh: line 3: badblocks: команда не найдена.
И вот как это понимать.

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

Можно еще отправлять результат работы скрипта на почту указав команду
MAILTO=user@email.ru

Для себя записываю 🙂
Нужно проверять работает ли сервис и если упал запускать заново

вообще строка выглядит так:
test "$(systemctl is-active zoneminder)" = "inactive"; echo $?
при запущенном сервисе выдает 1, при остановленном – 0
Здесь 0 это true

в crontab чтобы проверялось каждую минуту пишем:
*/1 * * * * root test "$(systemctl is-active zoneminder)" = "inactive" && service zoneminder restart

здравствуйте!
спасибо за статью!
объясните пожалуйста, зачем тут писать путь- "@hourly /usr/local/bin/serve" если и так указано что запускать надо из папки "hourly"
и еще, что такое "serve", это папка или файл?

serve – это пример, вместо него должен быть исполняемый скрипт (файл). Переменную @hourly надо использовать в crontab -e, если использовать папку, то её не надо (в папку нужно только поместить сам скрипт или ссылку на него).

Здравствуйте,мне надо запускать скрипт rebootsv каждую минуту.
Я записал через crontab -e вот так:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Изначально файл был пуст)
Файл сохранил.
Но почему то у меня не чего не работает,помогите мне пожалуста.

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

Как настроить cron средствами панели ISPmanager 5

Настраивайте cron-сценарии через панель управления в разделе Система → Планировщик

Чтобы добавить новые задания, нажмите «Создать». Откроется интерактивный редактор cron-сценариев:

В поле «Команда» укажите полный путь до скрипта или команду, которая должна выполняться (для системных команд полный путь можно не указывать). Например, полный путь до файла script.pl, размещенного в корне площадки, будет выглядеть так:

Убедитесь, что файл, который нужно запустить, имеет права на чтение+исполнение (r+x) для владельца файла. Поменять права на нужные можно командой:

В поле «Описание» вы можете сделать пометку, чтобы не забыть что выполняет данный сценарий

Далее выберите периодичность, с которой будет запускаться Ваш сценарий. Есть два варианта настройки — базовый и экспертный.

Базовый — вы выбираете один из перечисленных вариантов в строке «Выполнить»: каждый час, ежедневно, еженедельно, ежемесячно, ежегодно, при запуске.

Экспертный — гибкая настройка периодичности запуска: минуты, часы, дни месяцев, месяцы, дни недели (0 – воскресенье). Формат ввода: * – все минуты; */n – каждые n минут; n – с началом минуты n; a,b,c-e – с началом минут a,b,c,d,e

Примеры базового режима настройки периодичности запуска:

  • выполнять задание по понедельникам в 1 час 15 минут ночи

  • выполнять задание 5 апреля в 0 часов 1 минуту каждый год

Примеры экспертного режима настройки периодичности запуска:

  • выполнять задание раз в час в 05 минут

  • выполнять задание по понедельникам в 1 час 15 минут ночи

  • выполнять задание 5 апреля в 0 часов 1 минуту каждый год

Когда все поля будут заполнены (кроме поля «Описание», оно необязательное), нажмите «ОК».

Отправка отчетов на email о выполнении сценария

Для настройки уведомлений укажите email, на который будут приходить уведомления о выполнении сценария. Для этого перейдите в раздел «Планировщик»

Нажмите на кнопку «Настройки» и в поле «Адрес e-mail» укажите email, на который необходимо отправлять уведомления о выполнении сценариев.

В настройках сценария убедитесь, что не стоит галочка напротив поля «Не отправлять отчет по e-mail».

Как настроить cron по ssh

Конфигурирование сценариев cron производится через unix shell. Определите, какие программы нужно запустить, и узнайте полные пути к ним на диске сервера. Для этого перейдите с помощью команды cd в каталог, где находится запускаемая программа, и узнайте полный путь к этому каталогу командой pwd. Путь может выглядеть так — /home/u12345/scripts/script.pl.

Убедитесь, что файл имеет права на чтение+исполнение (r+x) для пользователя, от которого вы запускаете скрипт. Поменять права на нужные можно командой chmod 750 script.pl

750 — полные права владельцу файла, группе – чтение и исполнение, остальным – доступ запрещен.

Читайте также:  Газовый котел сиберия 23 отзывы цены

Выполните команду crontab -e – планировщик будет менять план пользователя, от имени которого вы запускаете cron. При первом запуске будет предложен выбор текстового редактора. Выберите редактор с которым вы уже знакомы. Как пример мы рассмотрим текстовый редактор vi. После ввода команды вы окажетесь в текстовом редакторе vi (п), где сможете вводить текст сценария для cron.

Краткая справка по редактору vi:

  • для вставки текста нажмите i, затем вводите текст
  • для удаления символов нажмите ESC, а затем наберите x
  • для выхода из vi без сохранения изменений нажмите ESC, а затем наберите :q!
  • для сохранения и выхода нажмите ESC, а затем наберите :wq

Задания для cron пишутся по одному в строке. После каждой строки, в том числе после последней или единственной, обязательно нажмите enter, иначе задания работать не будут.

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

поле1 поле2 поле3 поле4 поле5 команда

Значения первых пяти полей:

  • минуты — число от 0 до 59
  • часы — число от 0 до 23
  • день месяца — число от 1 до 31
  • номер месяца в году — число от 1 до 12
  • день недели — число от 0 до 7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс)

Для каждого конкретного параметра можно задать несколько значений через запятую. Например, если в поле «часы» написать 1,4,22, то задание будет запущено в 1 час ночи, в 4 часа утра и в 22 часа. Можно задать интервал — 4-9 будет означать, что программу нужно запускать каждый час в период с 4 до 9 часов включительно.

Символ «*» означает «все возможные значения». Звездочка «*» в поле «часы» будет означать «запускать каждый час». Символ «/» служит для указания дополнительной периодичности задания. Например, «*/3» в поле «часы» означает каждые три часа. Если определены поля «день месяца» и «день недели» (не равны *), то такое задание будет выполняться в каждый указанный день недели независимо от дня месяца.

такая команда будет выполняться в 13 часов 13 минут каждую пятницу и каждое 10 число месяца, даже если 10 число не совпадет с пятницей.

Cron позволяет запускать сценарии при загрузке системы — укажите @reboot в начале сценария вместо периодичности запуска:

Так выглядит простейший сценарий cron:

Скрипт /home/u12345/script.pl будет автоматически запускаться каждые три часа во вторник и в пятницу. Введите такой сценарий в редакторе vi, выйдите с сохранением результатов редактирования. Задание будет выполнятся с указанной периодичностью, если вы не допустили ошибок.

Cron сообщает об ошибках в сценарии:

Исправьте ошибки и попробуйте сохранить задание опять.

Посмотреть список уже установленных в cron сценариев можно командой crontab -l:

Если вам нужно запускать какую-то программу один раз в день, выбирайте ночное время. С с 2 до 8 часов ночи нагрузка на серверы минимальна. Если программа требует больших ресурсов, ночью она выполнится быстрее, чем днём.

Примеры использования cron

  • выполнять задание раз в час в 0 минут — 0 */1 * * * /home/u12345/script.pl
  • выполнять задание каждые три часа в 0 минут 0 */3 * * * /home/u12345/script.pl
  • выполнять задание по понедельникам в 1 час 15 минут ночи 15 1 * * 1 /home/u12345/script.pl
  • выполнять задание 5 апреля в 0 часов 1 минуту каждый год 1 0 5 4 * /home/u12345/script.pl
  • выполнять задание ежемесячно 1 числа в 6 часов 10 минут 10 6 1 * * /home/u12345/script.pl

Как запустить PHP-скрипт по расписанию

Запускайте скрипты на языке PHP в указанное время с желаемой периодичностью с помощью PHP-CLI интерпретатора.Так может выглядеть команда на запуск скрипта script.php — /usr/bin/php -q $HOME/script.php> /dev/null 2>&1

Поскольку не все PHP-программы могут работать через CLI SAPI без предварительной модификации, можно запускать их через wget:

Указывайте путь до утилит полностью, от корня файловой системы. Если в скрипте используются функции require, include, в которых указаны относительные пути — в начале выполняемого скрипта используйте вызов функции chdir(), которая задаст текущую рабочую директорию. Или воспользуйтесь встроенной командой cd.

Как получить сообщения об ошибках от программ, запускаемых cron

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

Вы будете получать письмо с тем, что выводят скрипты каждый раз, когда cron запускает задачу. Если вы напишете скрипт, который будет печатать строчку «Hello, world» и поставите его на выполнение через cron — вы будете получать письмо со строкой «Hello, world» каждый раз, когда cron запустит такой скрипт.

Если текст, выводимый скриптом, вам не нужен — добавьте в конец строки-сценария для cron символы > /dev/null 2>&1

Полностью строка для cron будет выглядеть так:

Проверьте корректность синтаксиса скриптов, которые вы устанавливаете на выполнение через cron. Скрипты могут содержать ошибку и работать неодинаково при запуске через веб-сервер и через cron, и так далее. Перед запуском проверьте скрипт командой в unix shell:

Если ошибок в скрипте нет, вы увидите сообщение «No syntax errors detected in script.php».

Как запустить сценарий от имени пользователя

Для повышения безопасности системы скрипт запускают от имени определённого пользователя. Убедитесь, что у пользователя есть права на запуск скрипта. Укажите перед основной частью скрипта su -l имя_пользователя, от которого хотите запустить скрипт.

Например, для запуска сервера TeamSpeak3 от имени пользователя ts3server используется следующая команда:

Скрипт расположен в домашнем каталоге пользователя, куда мы автоматически попадаем при авторизации.

Ограничения

Для программ, которые запускаются через cron, действуют такие же ограничения по потребляемым ресурсам, как для процессов, запускаемых пользователем в unix shell. Речь идет об ограничениях на время выполнения программы, количеству доступной памяти, ограничениях на размер файлов и так далее.

admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *