Примеры крон. Что это такое Cron? Запуск PHP-файлов по расписанию с помощью Cron

В наших материалах посвященных Ubuntu Server время от времени затрагивается вопрос выполнения каких либо задач по расписанию. Чтобы не объяснять каждый раз одно и тоже мы решили создать данный материал, который должен помочь системным администраторам освоить и эффективно использовать планировщик задач в Linux.

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

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

Чтобы создать или изменить пользовательское расписание наберите команду:

Crontab -e

При первом запуске утилита предложит выбрать редактор, мы рекомендуем выбирать mcedit (требует установленного mc), либо другой редактор, с которым вы умеете работать.

Формат строк расписания имеет вид:

Минута час день месяц день_недели команда

  • Минута - время в минутах от 0 до 59
  • Час - от 0 до 23
  • День - день месяца от 1 до 31
  • Месяц - от 1 до 12 либо буквенные обозначения jan - dec
  • День недели - от 0 до 6 (0 - воскресенье) или sat - sun
  • Команда - строка в формате командного интерпретатора которая будет исполнена, допускается запись типа команда1 && команда2 для запуска нескольких команд подряд.

Значения минут, часов, дней можно указывать следующим образом:

  • Значение - число обозначающее дату или время, допускается подстановочный знак * допускающий полный диапазон значений
  • Несколько значений - допускается указывать несколько значений через запятую, например 2,14,22
  • Диапазон значений - указывается через дефис, например 2-10
  • Шаг значений - указывается через дробь, в знаменатель которой ставится шаг, например */3 - каждое третье значение 0, 3, 6, 9 и т.д. В качестве числителя должен быть диапазон значений либо звездочка.

Рассмотрим следующий пример записи:

0 8-19/2 * * 1 /home/ivanov/test

Она означает что каждый второй час с 8 до 19 (8, 10,12,14,16) по понедельникам запускать скрипт test в домашнем каталоге Иванова.

Сразу хотим предостеречь вас от распространенной ошибки, при указании периодического исполнения все даты должны быть указаны явно, звездочка обозначает полный диапазон значений, а не их отсутствие. Например если вам требуется исполнять некий скрипт каждый час с 10 до 15 неправильно будет:

* 10-15 * * * /home/ivanov/test

Данная строка приведет к запуску скрипта каждую минуту в диапазоне с 10 до 15 часов. Правильно будет:

0 10-15 * * * /home/ivanov/test

Данная запись позволит запускать скрипт в начале каждого часа указанного диапазона.

Кроме даты можно использовать ряд специальных строк:

  • @reboot - выполнять команду при перезагрузке
  • @yearly или @annually - выполнять 1 января, аналогично записи: "0 0 1 1 * "
  • @monthly - выполнять 1 числа каждого месяца, аналогично "0 0 1 * * "
  • @weekly - выполнять каждое воскресенье, равносильно "0 0 * * 0 "
  • @daily или @midnight - ежедневно в полночь,"0 0 * * * "
  • @hourly - раз в час, "0 * * * * "

Так для ежедневного исполнения нашего скрипта каждую полночь можно написать:

@midnight /home/ivanov/test

Завершив составление расписания сохраняем файл и выходим из редактора. Пользовательское расписание будет сохранено в /var/spool/cron/crontabs под именем текущего пользователя.

Для системных и административных задач предусмотрен файл /etc/crontab синтаксис записей в нем отличается наличием дополнительного значения - пользователя, от чьего имени будет запущено задание:

Минута час день месяц день_недели пользователь команда

Пример такой записи:

0 19 * * 1-5 root /etc/backup

Согласно которой в 19:00 с понедельника по пятницу будет запускаться скрипт /etc/backup от имени пользователя root .

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

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

Оригинал: Using cron scheduler on Linux systems
Автор: Rares Aioanei
Дата публикации: 29 сентября 2011 года
Перевод: А. Кривошей
Дата перевода: ноябрь 2011 г.

1. Введение

Если вы уже имеете некоторый опыт системного администрирования Linux, то должны знать, что такое cron и для чего он предназначен. Если же вы только начинаете работать с Linux, то эти знания вам пригодятся. Даже если вы уже изучали использование cron, данная статья поможет вам освежить знания.
Название cron происходит от Cronos, древнегреческого олицетворения времени. И это правильно выбранное имя, так как основным предназначением cron является помощь в планировании различных задач, которые система должна выполнить в заданное время. Если вы пользовались Windows, то вероятно вам приходилось копаться в утилите Scheduled Tasks. В целом назначение у программ аналогичное, но реализация разная. Cron предназначен для серьезных задач системного администрирования и обладает большей гибкостью. В качестве примера реальной задачи можно привести резервное копирование. Понравится ли вам вручную выполнять резервное копирование данных на нескольких сотнях машин? Думаю, нет. Вы просто пишете простой скрипт с использованием rsync, планируете его выполнение, например ежедневно, и забываете об этом. Все, что необходимо в дальнейшем - время от времени проверять логи. Некоторые даже используют cron для напоминания о важных личных событиях, например о днях рождения. Но cron - это просто демон, запускающий указанные вами задания. А имеется ли утилита, помогающая редактировать/добавлять/удалять эти задачи? Конечно имеется, и называется она crontab (от cron table). Однако будем двигаться вперед последовательно и начнем с инсталляции.

2. Инсталляция cron

Большинство дистрибутивов используют Vixie Cron и некоторые другие производные как дефолтную реализацию cron, и именно их мы будем рассматривать в этой статье. Кроме того, практически во всех дистрибутивах cron уже предустановлен, так как он является очень важной частью системы Linux. Хотя обычный пользователь, как правило, никогда не работает с ним напрямую, система и многие приложения используют cron (хорошим примером является периодическое обновление базы данных man-страниц). Значимым исключением является Gentoo, где необходимо вручную установить vixie-cron и добавить его в runlevel по умолчанию. В Arch, Debian, Slackware, Ubuntu, Fedora и OpenSUSE cron установлен по умолчанию и автоматически запускается при загрузке системы. Мы надеемся, что вы изучите man-страницы cron и crontab, так как во многих дистрибутивах используются их пропатченные версии, что делается для лучшей интеграции программы под конкретный дистрибутив. Поэтому существует вероятность, что функция, которая имеется например в Gentoo, будет недоступна в Slackware. В любом случае, нет ничего лучше чтения man-страниц, особенно если имеешь дело с новой программой, которую собираешься достаточно часто использовать.

3. Использование cron

Во-первых, мы должны убедиться, что cron запущен:

$ ps faux | grep cron

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

Root 1424 0.0 0.0 22000 884 ? Ss 13:56 0:00 /usr/sbin/cron

Теперь заставим cron работать. Сначала необходимо подумать о том, какую команду мы будем использовать. Требует ли она привилегий root? Предположим, мы будем использовать crontab, чтобы добавить простой скрипт на выполнение через каждые пять минут как простой пользователь.

3.1. Crontab

3.1.1. Пример

Напишем простой скрипт, который будет выводить обычное диалоговое окно на базе curses в терминале (требуется dialog и любой эмулятор терминала - мы используем xterm):

#!/bin/sh xterm -e "dialog --msgbox "Testing cron..." 234 234" # This is a very simple example, treat it as it is

Назовем файл crontest.sh и сделаем его исполняемым, так как все, что запускается с помощью cron, должно быть исполняемым:

$ chmod +x crontest.sh

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

E ставится для редактирования, -r - для удаления. Будьте очень осторожны! Многие системные администраторы по неосторожности вводили -r вместо -e, тем более что эти клавиши расположены рядом, и удаляли все записи из crontab. В любом случае, скорее всего вы увидите полностью закоментированный файл (в crontab для обозначения комментариев используется #), в котором приведены примеры и описаны назначения полей записей. Да, запись состоит из полей, последнее из которых задает исполняемую команду, а остальные - временные характеристики. Итак, наша запись в crontab для скрипта, запускаемого каждые пять минут, выглядит следующим образом:

$ */5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh

Нам необходимо экспортировать переменную DISPLAY, чтобы xterm не выдавал ошибки вида "DISPLAY is not set". Теперь посмотрим назначение каждого поля.

3.1.2. Поля crontab

Если вы работали ранее с символами для подстановки, то вам не составит труда освоить использование звездочки в crontab: она означает, что вместо нее подставляются все возможные значения поля. Поля по умолчанию в Linux (будьте внимательны, некоторые Unix-системы используют другие реализации cron) обозначают, слева направо: минуту, час, день месяца, месяц, день недели, год (необязательно) и исполняемую команду. Таким образом, если мы хотим, чтобы наш скрипт запускался каждые пять минут, каждый час, каждый день, каждый месяц и каждый год, наша запись должна выглядеть так:

5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh

Мы призываем вас быть осторожнее с полем дня недели: в вашей стране первым днем недели может быть понедельник, а в других странах им может быть воскресенье. Если работаешь в мультикультурной, многонациональной среде, необходимо помнить о культурных и религиозных особенностях. Cron отправляет уведомления пользователю, которому принадлежит запись, на его почтовый адрес по умолчанию ($user@$hostname). Если вы хотите изменить адрес электронной почты, просто добавьте "MAILTO=$email_address" в crontab. Если вы хотите отключить эту функцию, добавьте ">/dev/null 2>&1" в конец записи.
Теперь, если вы уже устали от всплывающего каждые пять минут окна, снова запустите crontab -e, чтобы удалить или, что проще, закомментировать запись. Чтобы просмотреть содержимое crontab, просто используйте опцию -l (list).

3.2. Взгляд на /etc/

3.2.1. Скрипты cron

В предыдущих разделах мы решали простые и тривиальные задачи, просто для разминки, а теперь мы уже займемся серьезными делами. Заголовок данного раздела относится к директориям в /etc, которые отвечают за периодические задачи по обслуживанию системы. Например, в директории /etc/cron.weekly имеется скрипт man-db, который обновляет базу данных man-страниц. Все подобные скрипты включены в состав дистрибутива и запускаются согласно файлу /etc/crontab. Поэтому, если вы хотите разобраться их работе, лучше всего изучить содержимое этого файла. Вы увидите записи, похожие на те, что мы делали ранее, но исполняемые команды будут отличаться. "run-parts" - это небольшая утилита, созданная для запуска всех скриптов в заданном каталоге.
Внимательный читатель может заметить, что в /etc/crontab имеется одно поле, которого мы не видели при редактировании своего crontab - это поле "user". Это сделано по соображениям безопасности. Если вы вводите команду crontab -e как $user, это значит, что любая команда запускается от имени $user. Но так как /etc/crontab относится ко всей системе, необходимо явно задавать пользователя, так как может потребоваться запускать определенные скрипты или программы от имени другого пользователя, а не от root, особенно если системный администратор заботится о безопасности и добавляет пользователей и группы в систему по мере необходимости. Пример: для резервного копирования не нужны все привилегии root, требуются только права на чтение и запись в определенные директории, поэтому администратор создает группу backup и пользователя backupadmin с необходимыми правами и запускает ночные скрипты резервного копирования с помощью записи:

30 23 * * * backupadmin /home/backupadmin/nightlybkup.sh

Эта запись запускает скрипт nightlybkup.sh каждую ночь в 23:30. Если мы захотим запускать резервное копирование только с понедельника по пятницу, нужно отредактировать нашу запись:

30 23 * * 1-5 backupadmin /home/backupadmin/nightlybkup.sh

Если вы захотите запускать резервное копирование только по понедельникам, средам и пятницам, замените "1-5" на "1,3,5". Когда вы точно знаете, что вам нужно, cron становится понятным и простым в использовании.

4. Размышления о безопасности

Существует множество ситуаций, когда вы не хотите, чтобы пользователь, имеющий доступ к вашей системе, имел возможность создавать записи crontab. Здесь в игру вступают файлы /etc/cron.deny и /etc/cron.allow. Их использование аналогично /etc/hosts.allow и /etc/hosts/deny, поэтому, если вы работали с этими файлами раньше, то будете чувствовать себя как дома. Этих двух файлов (cron.deny и cron.allow) по умолчанию нет в системе, по крайней мере на системе, в которой мы работаем, поэтому по умолчанию всем разрешено создавать записи в crontab. Вы можете проверить, какие файлы, относящиеся к cron имеются в вашем каталоге /etc с помощью команды:

$ ls /etc | grep cron

И снова напоминаем, что все сказанное справедливо для Linux, так как отсутствие этих файлов на Solaris означает прямо противоположное, кроме того, файлы расположены в других местах. Сначала проверяется cron.allow, поэтому обычно мы вводим "ALL" в cron.deny, а затем добавляем пользователей, которым мы хотим предоставить доступ, в cron.allow.

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

Каждую минуту:

* * * * * /usr/local/bin/check-disk-space.sh

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

По дням:

30 02 10 01,06,12 * /home/$user/bin/checkdrive.sh

Эта команда будет запускать скрипт checkdrive.sh в 02:30 каждое 10 число января, июня и декабря.

Каждые полчаса:

00,30 * * * * /home/$user/backupdata.sh

Только по выходным:

* * * * 6,7 /usr/bin/weekend

Дважды в день:

20 11,16 * * * /usr/sbin/command

Команда будет выполняться каждый день в 11:20 и 16:20.

Каждый час в один конкретный день:

01 * 2 05 * /sbin/system_command

Каждые 10 минут во время пяти рабочих дней (понедельник - пятница):

*/10 * * * 1-5 /usr/local/bin/check-disk-space.sh

Только в рабочее время:

00 09-17 * * 1-5 /usr/local/bin/check-disk-space.sh

Эта команда будет выполняться один раз в день с 9 до 17 часов.

0 0 1 1 * /usr/local/bin/check-disk-space.sh

Дважды в год в 12:00 и в 24:00

0 0,12 1 */6 * /usr/local/bin/check-disk-space.sh

Эта команда будет исполняться дважды в год (каждые 6 месяцев) в 12:00 и в 24:00.

Каждый третий четверг любого заданного месяца в 10:00:

0 10 15-21 * 4 /usr/local/bin/check-disk-space.sh

Каждый день через 20 минут после каждого четного часа:

20 0-23/2 * * * /usr/local/bin/check-disk-space.sh

Эта команда будет выполняться каждый день через 20 минут после каждого четного часа (0:20, 2:20...22:20).

6. Заключение

Если в начале вам показалось, что записи crontab трудны для понимания и запутаны, уверяю, что при их постоянном использовании вы очень скоро будете наизусть помнить порядок и назначение всех полей, а также название и расположение всех файлов, которые необходимо редактировать. Все, что требуется - это практика.

Если вам понравилась статья, поделитесь ею с друзьями:

Полезным механизмом, обеспечивающим контроль за выполнением процессов в linux является планировщик заданий или cron , файл crontab в директории etc с помощью этого файла добавляются скрипты, задачи, которые мы можем написать для работающей системы, например для контроля работы linux системы по e-mail

Cron – служба-демон используется в linux/unix системах в качестве планировщика заданий. Демон позволяет периодически запускать скрипты на выполнение.

Создаваемые файлы помещаются или в директорию:
/usr/spool/cron/crontabs или /var/spool/cron/tabs
Редактировать их нужно только через выполнение crontab –e
В зависимости от периода выполнения файлы могут быть помещены в директории:
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

Создание заданий cron
Создание задания в crontab выглядит как заполнение шести обязательных полей, их значение следующее:
1. Минуты – цифра от 0-59
2. Часы – цифра от 0-23
3. День месяца – цифра от 1-31
4. Номер месяца в году – цифра от 1-12
5. День недели – цифра от 0-7
0-воскресенье, 1-понедельник, 2-вторник, 3-среда, 4-четверг, 5-пятница, 6-суббота
Для каждого из вышеперечисленного параметра может быть заданы значения:
а) Через запятую – 3,7,9 (в поле день месяца 3,7,9 соответственно)
б) Через дефис – 3-9 (в поле час будет означать выполнение в 3,4,5,6,7,8,9)
в) * - будет выполняться во все возможные значения
г) / - задание дополнительных периодов задания - */8 в поле минуты, будет выполняться каждую восьмую минуту

Как запустить задачу cron при загрузке системы. Для запуска скрипта при загрузке системы Linux используется ключевое слово reboot. Например:

Кроме того можно использовать еще следующие ключевые слова:
@yearly – то же что и 0 0 1 1 * (раз в год)
@daily – то же что и 0 0 * * * (раз в день)
@hourly – то же что и 0 * * * * (раз в час)

Команды для управления crontab
- просмотреть задания для текущей учетной записи
crontab –l
- просмотреть задания нужной учетной записи
crontab –u username –l
- Редактирование cron заданий
crontab –e
- Редактирование cron заданий заданного пользователя
crontab –u username –e

Примеры заданий cron:
Выполнить задание в 7 утра каждый день
0 7 * * * root /home/scripts/mount.sh
Выполнить задание в 17:30 каждый день
30 17 * * * root /home/scripts/mount.sh
Выполнить задание каждый месяц первого числа в 0 часов 0 минут
0 0 1 * * root /home/scripts/mount.sh
Выполнять задание через каждые 4 часа
* * /4 * * * root /home/scripts/mount.sh
Выполнить задание при загрузке Linux
@reboot root /home/scripts/mount.sh

Дополнительная настройка cron
Для того, чтобы получать отчет по заданиям cron можно определить переменную MAIL в начале cron сценария
MAIL=mail.mail.local
По умолчанию в письме будут присутствовать все сообщения выводимые сценарием, чтобы этого не происходило, нужно добавить в задании cron сценария > /dev/null 2>&1
Чтобы отключить получение сообщений от cron нужно оставить переменную MAIL не установленной
MAIL=” ”
Есть возможность определить путь до файла с скриптом используя переменную PATH, например
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/scripts, в crontab позволит писать в строке параметров задания
@reboot root mount.sh
Запуск сриптов через cron используя интерпретатор php
* 1 * * * /usr/local/bin/php – q mount.sh > /dev/null 2>&1
/usr/local/bin/wget –O /dev/null –q http://"site.com/cron.php?action=123"

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

Именно для этих задач в Linux используется системный сервис 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. Какой-нибудь обслуживающий скрипт. Самый простой пример - запускать его каждую минуту:

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

0 * * * * /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 минут. Для этого используется разделитель косая черта - "/":

*/10 * * * * /usr/local/bin/serve

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

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

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

@hourly /usr/local/bin/serve

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

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 для удобного планирования автоматических задач. Надеюсь, эта информация была полезной для вас.

Введение

Размещая сайт, мы желаем добиться бесперебойной работы без нашего участия.

Значит, требуется автоматизировать процессы, и тут на помощь приходит cron.

Cron - программа, демон для автоматического запуска программ и скриптов на сервере в необходимое время.

Crontab в панели управления Timeweb

Если ваш аккаунт оплачен, и вас не уличили в спам-рассылке, то раздел Crontab доступен и работоспособен:

Интерфейс Crontab в панели управления Timeweb дружелюбен и интуитивно понятен: даже начинающие пользователи, до этого не имевшие опыта работы с cron, легко разберутся в том, как создавать задачи. Создав задачу, вы сможете в автоматическом режиме делать бэкапы, рассылки, чистить кэш и выполнять другие типовые действия.

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

После основной информации я расскажу о нюансах, которые важно учитывать при работе с cron.

В разделе Crontab создаются новые задачи. Для этого потребуется заполнить поля:

  • Название . Это имя нашей задачи.
  • Тип файла и путь до файла . В зависимости от того, на каком языке написан сценарий, выбираем тип файла и путь до него. Если в задаче запускается скрипт, требующий переменные веб-сервера, запуск напрямую через php-интерпретатор приводит к ошибкам. Поэтому в случае, когда Вы используете скрипт, работающий при запуске через адресную строку браузера, необходимо выбирать тип файла "HTTP-запрос" и указывать URL для запроса аналогично тому, как он указывается в адресной строке "ваш_сайт/путь/до/скрипта/script.php?параметр1=значение1&параметр2=значение2".

При необходимости указывайте один ящик администратора в разделе Crontab. На этот ящик будут приходить сообщения в том случае, если бы при запуске скрипта в консоли появилось бы сообщение.

Нюансы

Небольшие нюансы, о которых стоит помнить при работе с cron.

1. Cron работает, если аккаунт оплачен и нет ограничений.

Проверить статус можно создав файл с расширением php (например twtest.php) с кодом:

И обратившись к файлу в браузере.

В браузере увидите информацию:

uid=12345(login) gid=600(customers) groups=600(customers) - говорит о том, что cron и почта доступны

uid=12345(login) gid=600(customers) groups=601(newcustomers),600(customers),660(spammers) - пишем в поддержку

2. Файл, который запускаете, должен иметь права на чтение и исполнение (r+x).

По умолчанию файлы на хостинге создаются с правами 600. Поменять права на нужные можно по ssh командой:

Chmod 744 twtest.php

или в Файловом менеджере, об этом у Timeweb есть инструкция:

3. Дабы не захламлять e-mail лишними письмами, настройте часто исполняемые скрипты на запись лога в файл , а не в консоль.

CRON по SSH

Настройка планировщика по ssh описана столько раз, что нового рассказать не получится.

Подключение по ssh подробно описано в справочном центре Timeweb:

После прочтения надо найти файл со скриптом, перемещаясь между директориями командой cd. Найдя файл введите pwd и скопируйте путь (пример "/home/c/cc123456/public_html/test/")

Если не знаете какие права у файла введите:

Chmod 744 имя_файла

При подключении по ssh редактировать задачи можно командой

Crontab -e

В первый раз сервер попросит выбрать редактор:

Select an editor. To change later, run "select-editor". 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/mcedit 4. /usr/bin/vim.basic 5. /usr/bin/vim.tiny Choose 1-5 :

Система указывает на простой редактор nano под цифрой 2. Если не рассчитали силы или случайно выбрали vi, не пугайтесь, нажмите Esc, затем введите двоеточие q и нажмите enter.

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

Select-editor

и выберете nano.

Задания пишутся по строкам. Пример:

1 2 3 4 5 /opt/php56/bin/php /home/с/сс123456/public_html/twtest.php

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

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

Для каждого параметра возможно задать необходимое количество значений через запятую. Например, если в поле «часы» написать 8,23, то задание будет запущено в 8 часов утра и в 23 часа вечера. Можно задать интервал: 9-18 будет означать, что программа запустится каждый час в период с 9 до 18 часов включительно. Символ "*" означает «все возможные значения». Например, указание "*" в поле «часы» будет означать «запускать каждый час». Символ "/" служит для указания дополнительной периодичности задания. Например, "*/3" в поле «минуты» означает «каждые три минуты».

"/opt/php*/bin/php" где php*/ = php53/ php5.3/ php54/ php5.4/ php56/ php5.6/ php70/ php7.0/ php71/ php7.1/

Последняя запись указывает на путь до файла и название файла, который запускаем.

Нюансы

  1. При изменении в панели управления в разделе "Crontab" удалятся изменения записей сделанных по ssh!
  2. Если определены оба поля "день месяца" и "день недели" , то такое задание будет выполняться в каждый указанный день недели независимо от дня месяца. Например, следующая команда будет выполняться в 9 часов 19 минут каждую среду и каждое 7 число месяца, даже если 7 число не совпадает со средой.

19 9 7 * 3 /opt/php56/bin/phpn /home/с/сс123456/public_html/twtest.php

Частные случаи

Для запуска задачи чаще, чем раз в минуту, используем sleep.

Для этого пишем в crontab:

* * * * * /opt/php56/bin/php /home/k/konoplev/tmp/twtest.php; /bin/sleep 30; /opt/php56/bin/php /home/k/konoplev/tmp/twtest.php

для запуска файла каждые 30 секунд.

Иногда при использовании планировщика запуска программ cron неизвестно, сколько длится выполнение скрипта. Для избежания двойного запуска скрипта требуется проверка на завершение предыдущего запуска скрипта.

Логичным вариантом будет создание lock файла и при запуске скрипта проверять наличие файла. Но на хостинге Timeweb, как и на других хостингах, присутствует ограничение по процессору. Скрипт зависит от условий и времени выполнения, а значит, мы не можем предугадать время выполнения скрипта. Если скрипт выполнится с нарушением правил и ограничений ( ), то процесс завершится со стороны хостинга. Тогда lock файл не будет удален, а значит, и скрипт не будет запускаться по крону, пока файл не будет удалён.

Маэстро из отдела инженеров рассказал, как решить задачу.

Для начала создаём sh скрипт в файл /home/c/cc123456/tmp/twtest.sh:

#!/bin/bash command=$@ no_spaces=`echo $command | sed -e "s/\s/_/g" -e "s|/|_|g"` pidfile=/var/tmp/$no_spaces.pid lockfile=/var/tmp/$no_spaces.lock if [[ -e $pidfile ]] then pid=`cat $pidfile 2>/dev/null` ps h $pid >/dev/null 2>/dev/null if [[ $? -eq 0 ]] then exit 1 else rm $lockfile fi fi echo $$ > $pidfile /usr/bin/flock -w 0 $lockfile $command rm $pidfile

В панели управления в разделе crontab выбираем тип "Исполняемый бинарный файл".

В поле “Полный путь” пишем:

/home/c/cc123456/tmp/twtest.sh /opt/php56/bin/php /home/c/cc123456/tmp/twtest.php

Где

  • /home/c/cc123456/tmp/twtest.sh - наш скрипт проверки
  • /opt/php56/bin/php - путь до нужного интерпретатора
  • /home/c/cc123456/tmp/twtest.php - путь до нашего скрипта

Указываем необходимое время запуска и придумываем название.

Заключение

Теперь вы знаете, как работать с cron и автоматически запускать задачи. Более подробную информацию о cron ищите в "man cron". Удачи!