Делаем «жизнь» в Linux проще или автоматизация запуска процессов с помощью cron. Cron — запуск программ пользователя в указанное время
В системе Linux автоматический запуск заданий выполняется демоном crond , а составлять расписания для автоматического запуска заданий могут не только администратор системы, но и пользователи.
Как работает crond
Принцип работы демона crond прост. После запуска (как правило, при загрузке системы) демон просыпается каждую минуту и проверяет, не запланирован ли запуск в эту минуту каких-либо программ. Если такие программы находятся, демон запускает их и отправляет по электронной почте сообщения пользователям, запланировавшим запуск.
Составление расписания заданий
Составление расписания - задача несложная. Расписание размещается в отдельном файле crontab . В каждой строке файла помещается задание, которое должно быть запущено в определенное время.
Формат записей файла crontab
Часть time-date (время-дата) состоит из пяти числовых полей, разделенных пробелами и определяющих время запуска задания:
Для удобства заполнения указанных полей введены следующие правила:
- Можно указывать значения в виде численных интервалов. К примеру, интервал 1-3 в поле часов означает 1.00, 2.00 и 3.00 пополуночи, 2-4 в поле дня недели - вторник, среду или четверг.
- Интервалы можно задавать с шагом больше единицы. Например, чтобы указать каждый второй час, начиная с полуночи, следует установить интервал 0-23 с шагом 2 через косую черту: 0-23/2
- Звездочка (*) указывает полный интервал значений поля - от минимального до максимального. Например, в поле дня месяца звездочка означает интервал 0-31, в поле дня недели - 0-7
- День недели или месяц можно указать первыми тремя буквами его (английского) названия
Примеры времени-даты
Несколько примеров заполнения полей времени-даты:
0 1 * * * Запуск задания ежедневно в 1.00 пополуночи 30 14 * * 0 Запуск задания по воскресеньям в 2.30 пополудни 0 23-7/2,8 * * * Запуск задания каждые 2 часа с 23.00 до 7.00 и в 8.00 0 12 * 1 mоn Запуск задания в полдень каждого понедельника января каждого года 0 12 2 feb * Запуск задания в полдень второго февраля каждого года
Поле command
Поле command (команда) отделено от полей времени-даты одним или несколькими пробелами и простирается до конца строки. Команды обрабатываются оболочкой /bin/sh .
Например, следующая запись в файле crontab предусматривает ежедневный запуск программы /usr/sbin/backup в 1.00 пополуночи:
0 1 * * * /usr/sbin/backup
Некоторым командам (например, mail) требуется ввод информации с устройства стандартного ввода. Это указывается при помощи знака процента (%). Первый такой знак обозначает начало стандартного ввода, каждый последующий - смену строки.
Редактирование файла crontab
Файл crontab редактируется командой crontab -e . Возможны два подхода:
- создание нового файла со всеми записями, которые должны входить в файл crontab , с последующей его записью на диск под этим именем по команде crontab ;
- непосредственное редактирование файла по команде crontab -e .
Запись из файла
Для записи содержимого файла crontab из другого файла необходимо создать этот другой файл (в привычном текстовом редакторе) со всеми записями, из которых должен состоять файл crontab . Это могут быть, к примеру, следующая запись:
0 1 * * * /usr/sbin/backup
Созданному файлу следует присвоить подходящее имя, например сron jobs . После того, как указанный файл создан, его содержимое необходимо записать в файл crontab командой:
~$ crontab cronjobs
Содержимое файла cronjobs полностью заменит содержимое файла crontab данного пользователя. Используя этот метод, любой пользователь может редактировать свой файл crontab . Суперпользователь обладает особым правом редактировать файлы crontab остальных пользователей. Редактирование чужого файла указывается флажком -u . Например, по команде:
~# crontab -u oleg cronjobs
файл cronjobs записывается как файл crontab пользователя oleg .
Непосредственное редактирование файла crontab
Команда crontab позволяет избежать многоступенчатой операции с созданием отдельного файла. Если ввести команду crontab с опцией -е, можно редактировать файл crontab непосредственно.
По умолчанию по команде crontab с опцией -е файл crontab загружается в редактор . Редактор Vi - мощный, хотя и сложный инструмент, популярный среди опытных пользователей Unix . Тот, кто предпочитает другой редактор, например Xedit , может установить соответствующее значение переменной среды EDITOR:
~$ export EDITOR=xedit
После этого ввод команды
приводит к открытию файла crontab в указанном редакторе.
Подобно тому, как обычный пользователь может редактировать собственный файл crontab , суперпользователь может редактировать файлы crontab остальных пользователей. Для этого используется команда:
~# crontab -u user-name -e
Просмотр файла crontab
Для просмотра содержимого файла crontab вводится команда:
Суперпользователь может просматривать файлы crontab остальных пользователей:
~# crontab -u username -l
Удаление файла crontab
Для удаления содержимого своего файла crontab пользователь вводит команду:
Суперпользователь может удалять файлы crontab остальных пользователей.
Я многое слышал о том, что в linux есть удобный планировщик задач cron. Однако, у меня не было необходимости им пользоваться, и разбираться в его настройки не хотелось… консоль, много английских букавок… было страшно. Но, благо, мои опасения были напрасны — всё до элементарного просто. В статье будет рассмотрено, как настроить выполнение своих скриптов по расписанию, и в качестве примера установим «кукушку».
Для начало немного о том, как это вообще работает.
При запуски системы стартует демон cron. Им можно управлять (останавливать/запускать/узнавать статус) командой: sudo service cron (stop/start/status). Но это редко, когда бывает нужно.
Сам демон cron большую часть времени спит, и слегка приоткрывает глаз раз в минуту, что бы проверить наличие заданий на это время. Если задания отсутствуют, то он опять уходит в спячку.
Задания находятся в файлах имена которые равны именам пользователя, а сами файлы лежат в папке /var/spool/cron/crontabs. Папка защищена от постороннего вмешательства и доступна только суперпользователю. Но, каждый пользователь может настроить расписание для своих задач, не зная пароля от рута (суперпользователя).
Что бы настроить cron для обычного пользователя достаточно набрать:
Если нужно создать задачу для другого пользователя, то запуск производится командой:
sudo crontab -u user -e
Заместо юзера пишем нужного пользователя, например root.
При первом запуске будет вопрос о редакторе… мне нравится nano. Он простой и запускается без графического интерфейса.
Синтаксис для задач очень прост. Рассмотрим пример со скриншота по запуску кукушки:
0 */1 * * * /home/zegi/bin/kuku
Всего в задаче 2 основных поля: 0 */1 * * * — обозначает время, когда будет срабатывать команда. А /home/zegi/bin/kuku — путь к скрипту в котором описана команда(ы).
С адресом к скрипту не должно быть проблем (zegi — это имя пользователя… не забудьте поставить своё). Но нужно пояснить, как задать крону время для выполнения скрипта.
Всего у нас 5 ячеек для ввода, которые разделяются пробелом.
1 — минуты (числа от 0 до 59)
2 — часы (от 0 до 23)
3 — день месяца (от 1 до 31)
4 — месяц в году (от 1 до 12… например февраль это 2)
5 — день в недели (от 1 до 7. Используется западная неделя, когда началом является воскресенье. т.е. ВС-1, ПН-2, ВТ-3, СР-4, ЧТ-5, ПТ-6, СБ-7).
Каждая ячейка обязательна должна быть заполнена. Если нужно, что бы команда выполнялась каждый месяц, то ставим * в 4-ом поле. Тоже самое относится и к остальным полям.
Вернёмся к примеру с кукушкой, когда скрипт срабатывает каждый час. Что бы задать периодичность используется / . Например если нужно, что бы задача выполнялась каждых 5 минут, по понедельникам то ставим:
Если нужно, что бы задача выполнялась каждый час, то придётся устанавливать и определённую минуту. Если оставить звёздочку(* */1 * * *), то крон будет выполнять каждую минуту — ибо условия соблюдены: он проверил все 5 ячеек и их значение соотвтествует текущему времени (минуты — всё равно. Часы — каждый час, а не только определённые).
Перед слешем всегда должна идти звёздочка. Например, назначить выполнение каждую минуту, начиная с 30-ой, вписав 30/1 — не получится.
Если нужно, что бы задача выполнялась не циклично, но несколько раз, то значения пишутся через запятую.
Например нужно выполнить задачу по будням в 12 часов дня и 6 вечера. То это будет выглядеть так:
* 12,18 * * 2,3,4,5,6
По окончанию редактирования задач, не забудьте сохранить изменения (Ctrl+O > энтер), а затем можно выйти (Ctrl+x).
Cron должен оповестить, что появилась новая задача и он готов её выполнять, написав: «crontab: installing new crontab».
Посмотреть созданные задачи (может быть вы ничего и не делали для себя, а администратор сети, что нибудь вам настроил) можно командой:
И в конце сам скрипт кукушки , который кукукает каждый час:
#!/bin/bash
h=`date +%l`
while [ $h -gt 0 ]
do
play ~/kukushka.wav
h=$[$h-1]
done
Скачать звук с кукушкой можно командой:
wget http://dl.dropbox.com/u/24844052/tuksik/kukushka.wav
Play входит в пакет sox. В ubuntu его можно установить командой.
Cron применяют для автоматизации выполнения поставленных задач на сервере. Он работает на Linux и отлично подходит для того, чтобы запустить программу или скрипт на определенное время и с определенной периодичностью, запланировав это действие заранее.
Настройка планировщика заданий Cron
Необходимые к выполнению задания записываются в виде строк, в которых необходимо указать период включения и команду, указывающую, что именно необходимо запустить. Для каждого задания отводится отдельная строка. Например:
30 3 * * 2 /yourdirectory/myscript.pl
На более понятном простому пользователю языке тут обозначены: Минуты/Часы/ДеньМесяца/ДеньНедели/Команда. Данный пример означает, что в 3:30 ночи, каждый вторник, Сron должен запускать файл с названием youdirectory/myscript.pl.
Если перечислить значения через запятую, например в пункте «День» написать 2,4,6, то файл будет запускаться в указанное время каждый вторник, четверг и субботу.
Если задать значения через дефис, то задача будет исполняться в указанном интервале времени. Например, если в пункте «Часы» задать 3-7, то файл будет запускаться каждый час с 3 до 7 утра.
Также можно задать периодичность, написав в графе времени, например, в «Часы» /12. Тогда задача будет исполняться каждые 12 часов.
Важно знать, что «*» означает не отсутствие значения, а все возможные значения. То есть, если задать * * * * 1 /yourdirectory/myscript.pl, желая, чтобы файл запускался каждый понедельник, то это окажется совершенно неверным и файл будет запускаться каждую минуту.
Еще одна важная особенность – это необходимость указания абсолютного пути к файлу. А также файлу необходимо иметь такие права доступа, чтобы он хотя бы мог запускаться.
Из представленных примеров становится понятно, что данный планировщик задач в Linux является очень удобным инструментом, поэтому предлагаем вам более подробно ознакомиться с некоторыми его особенностями.
Наиболее простым и распространенным методом работы с Cron является панель администрирования хостинга. Однако, у различных панелей конфигурация Cron происходит по-разному.
Иногда случается, что хостинг не предоставляет возможности работы с Cron через панель администрирования. В такой ситуации используют SSH-протокол. С помощью него подключаются серверу, используя программу PuTTY, и вводят задачи в командной строке.
Для начала работы следует ввести команду:
Crontab –e
Далее вы попадете в vi – текстовый редактор, однако, эти редакторы могут быть разными у разных хостингов. Если вы не знакомы с работой в vi, то вы можете ввести команду: EDITOR=ee crontab –e, которая перенаправит вас в более простой и понятный редактор.
В случае, когда хостинг не осуществляет поддержку открывшегося редактора, придется разобраться с работой vi:
- для ввода текста необходимо перейти в одноименный режим, нажав кнопку «i»;
- для выхода из режима воспользуйтесь кнопкой «Esc»;
- для удаления символа в режиме ввода текста воспользуйтесь клавишами «Esc», а затем «x»;
- сохранения и выхода из файла нажмите «:wq»;
- в обязательном порядке нажимайте клавишу «Enter» в конце каждой строчки, это необходимо для работы Cron;
- для просмотра уже имеющихся задач в Cron введите команду crontrab-l.
Примеры задач для Cron в linux
— Исполнять задание каждые 6 часов в 30 минут каждого дня каждого месяца:
30 */6 * * * /yourdirectory/myscript.pl
— Исполнять задание после каждой перезагрузки:
@reboot /yourdirectory/myscript.pl
— Исполнять задание 15 числа каждого месяца в 00 часов 00 минут:
0 0 15 * * /yourdirectory/myscript.pl
PHP-файлы
Чтобы запустить PHP-скрипты, обычно используют интерпретатор. Универсальной инструкции по его работе нет, так как разные хостинги используют разнообразный софт. В следствие этого часто прибегают к помощи WGET для запуска PHP в Cron. Вводим следующую запись:
1 2 * * 3 root wget -O - -q -t 1 http://mysite.com/file.php
Разберем более подробно:
- «-O-» — не дает Cron создавать дополнительные файлы, тем самым, избавляя сервер от лишнего хлама, так как работа происходит в консоли;
- «q» — операции больше не выводятся на экран;
- «t-1» — разрешение лишь одной попытки соединения.
Ограничения Cron
У самого Cron имеется всего одно ограничение – период исполнения задач. Если вы перегружаете сервер своего хостинга, он может поставить запрет на запуск Cron чаще, чем раз в несколько минут или час. Кроме этого Cron ограничен только ресурсами сервера, такими как: оперативная память, объемы данных, время выполнения команд и т.д.
Если сервер перезагрузится, то Cron сохранит все ваши задачи, перезагрузившись вместе с ним.
Отчет
У Cron существует настройка, чтобы настроить уведомления о его работе на электронную почту. Это особенно полезно, если при работе случится какая-либо ошибка. Чтобы включить такие уведомления на почту, необходимо в crontab вписать строчку:
MAILTO= [email protected]
После MAILTO= указывается необходимая почта. Указать их можно сразу несколько, перечислив через запятую. Теперь, если вдруг случится ошибка, вы будете проинформированы об этом. При чем, к вам на почту будут приходить и результаты работы скриптов. Однако, если данная функция вам мешает, ее можно и отключить, введя в конце задачи команду > /dev/null 2>&1.
, | |
На сегодня Cron является одним из наиболее распространенных способов автоматизации запуска процессов в Linux. Cron – это демон, который работает в фоновом режиме и позволяет планировать и автоматизировать запуск различных (в том числе и связанных с поддержкой сервера) задач. Для этого используется конфигурационный файл кронтаб (crontab).
Установка Cron
На данный момент почти все дистрибутивы поставляются с уже установленным по умолчанию демоном cron. Если же cron не установлен по умолчанию, его можно быстро установить при помощи следующих команд:
Ubuntu/Debian:
sudo apt-get update
sudo apt-get install cron
Cent OS/Red Hat Linux:
sudo yum update
sudo yum install vixie-cron crontabs
После завершения установки необходимо убедиться в том, что cron запущен в фоновом режиме:
sudo /sbin/chkconfig crond on
sudo /sbin/service crond start
Базовый синтаксис
Рассмотрим следующий пример задачи, запуск которой нужно спланировать:
5 * * * * curl http://www.google.com
Синтаксис планирования различных задач сначала может показаться запутанным. На самом деле он очень краток и прост, нужно просто разобраться, как его читать. Каждая строка делится на график и команду. В строку можно внести практически любую команду. График делится на 5 различных полей для планирования в следующем порядке:
<Минуты> <Часы> <Дни_месяца> <Месяцы> <Дни_недели>
Примеры использования cron
Данный раздел содержит примеры планирования наиболее общих задач.
Чтобы команда автоматически выполнялась каждую минуту:
Чтобы команда выполнялась каждую двенадцатую минуту часа (08.12, 09.12, и т.д.):
Чтобы команда запускалась каждые 15 минут:
0,15,30,45 * * * *
Чтобы команда автоматически выполнялась каждый день в 4 утра:
Чтобы команда выполнялась каждый вторник в 4 утра:
График можно делить. То есть, вместо 0,15,30,45 можно использовать:
Обратите внимание на диапазон 2-6. Данный синтаксис будет запускать указанную команду с 2.00 до 6.00 утра каждые 15 минут.
Как видите, чрезвычайно мощный и гибкий синтаксис cron позволяет указать практически любой интервал времени.
Настройка cron
Разработав график выполнения задач, необходимо поместить его в правильной точке системы, чтобы демон мог найти и прочесть его. В целом, таких точек в системе несколько, но, как правило, такой график помещают в crontab пользователя. Как уже говорилось, crontab – это конфигурационный файл демона cron, который содержит график запуска определенных команд и программ. Этот файл находится в /var/spool/cron/crontab, но его не принято редактировать напрямую. Для внесения в файл нужных программ используется одноименная команда – crontab. То есть, чтобы отредактировать файл crontab, можно просто ввести:
Эта команда откроет текстовый редактор, при помощи которого можно внести все необходимые изменения; каждую новую задачу нужно вносить в новую строку.
Чтобы просмотреть crontab, не внося никаких изменений, используйте команду:
Очистить crontab можно с помощью следующей команды:
Пользователь с повышенными привилегиями может редактировать crontab других пользователей при помощи:
crontab -u <пользователь> -e
Вывод cron
После выполнения задачи cron отправляет выходные данные на электронный адрес пользователя (если только вывод не нужно направить в лог или /dev/null). Адрес электронной почты можно указать вручную, внеся параметр MAILTO в верхнюю часть crontab. Также можно указать оболочку, которую нужно запускать, путь к двоичному файлу cron и домашнему каталогу. Для этого:
сначала откройте crontab:
затем отредактируйте его следующим образом:
SHELL=/bin/bash
HOME=/
MAILTO=”example@some_user.com”
#This is a comment
* * * * * echo ‘Run this command every minute’
Данная строка вернет Run this command every minute. Демон cron будет отправлять такой вывод на почту example@some_user.com. Это, конечно, не очень удобно. Как уже говорилось ранее, данный вывод можно направлять в лог-файл, чтобы избежать подобных ситуаций.
Для этого нужно просто добавить:
* * * * * echo ‘Run this command every minute’ >> file.log
Примечание: символы >> направят вывод в лог. Кроме логов можно также использовать /dev/null при помощи следующего PHP-скрипта, работающего в фоновом режиме.
* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1
Ограничение доступа к cron
Чтобы ограничить доступ к демону cron, нужно использовать файлы /etc/cron.allow и /etc/cron.deny. чтобы открыть (allow) или закрыть (deny) доступ определенному пользователю, нужно просто внести имя пользователя в соответствующий файл. По умолчанию демон cron доступен всем пользователям. Чтобы запретить доступ всем пользователям и предоставить доступ только пользователю example, нужно использовать следующую последовательность команд.