Наш канал в telegram

Микрокомпьютер Omega2. Часть 7. Выполнение задач по расписанию с помощью планировщика Cron

Что такое планировщик Cron и зачем он нужен

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

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

Механизм работы утилиты Cron достаточно прост. Все запланированные задачи описываются в специальном файле — crontab (/etc/crontab). В нём же для каждой задачи описано в какое время (или через какой интервал времени) эту задачу нужно запускать. Сама утилита работает в качестве демона (в фоновом режиме), постоянно мониторя, не пришло ли время выполнять какую-либо описанную в crontab задачу. Если время для выполнения какой-либо задачи пришло — Cron её запускает.

Как пользоваться планировщиком Cron

Для начала работы с Cron нужно выполнить в командной строке команду «crontab -e». Эта команда открывает файл /etc/crontab в вашем редакторе по умолчанию (опция -e). Если вы ранее не настраивали запуск каких-либо задач через Cron, то этот файл будет пустым.

В этот файл нужно вписать расписание запуска задач. На каждой строке прописывается условие запуска одной задачи. Формат записи следующий:

  * * * * * command to execute
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └─ день недели (0-7), 0-6 - дни от Sunday до Saturday (можно писать цифры или названия), 7 - это Sunday, так же как и 0
# │ │ │ └─── месяц (1-12)
# │ │ └───── день месяца (1 - 31)
# │ └─────── час (0 - 23)
# └───────── минута (0 - 59)

Знак «#» означает комментарий, знак «*» — любое значение, знак «/» перед значением означает, что указанное значение является интервалом.

Примеры различных условий:

min  hour  date  month  day of the week   когда будет сработывать условие
*/1   *     *      *      *               каждую минуту
15    */4   *      *      *               каждые 4 часа в 15 минут (7:15, 11:15, 15:15 и т.д.)
3     5     8,21   6,9    *               в 5:03 8 июня, 21 июня, 8 сентября, 21 сентября
0     0     3,8    *      *               в полночь 3 и 8 числа каждого месяца

Теперь давайте составим какой-нибудь реальный пример, скажем для запуска bash-скрипта /www/test.sh в 12:00 каждого первого мая:

# this is a comment
0 12 1 5 * /www/test.sh 
# this is a comment too

В Omega2 по-умолчанию используется редактор vi. В этом редакторе для того, чтобы сохранить изменения и выйти, — нужно нажать клавишу ESC (переключение в командный режим), потом ввести :wq и нажать Enter.

Для нормальной работы Cron, файл crontab должен обязательно заканчиваться комментарием. По крайней мере, так написано на сайте Onion. Причина такой оговорки в том, что каждая рабочая строка файла crontab (содержащая не коммент, а условие и задачу для запуска) должна заканчиваться символами конца строки и перевода каретки, которые добавляются автоматически при переходе на новую строку. То есть добавление комментария в последнюю строку просто гарантирует нам, что предпоследняя строка (которая может оказаться рабочей) оформлена надлежащим образом и следовательно будет обработана.

Если вы запускаете скрипты, для которых в системе не прописан обработчик по-умолчанию, то команда помимо пути к скрипту должна также содержать путь к обработчику (то есть выглядеть также, как если бы вы запускали этот скрипт из командной строки):

# запускаем файл test.php в отдельном потоке
0 12 1 5 * /usr/bin/php-cgi /www/test.php&
#

Кроме того, можно направить весь вывод, генерируемый в результате обработки очередной строки crontab, в отдельный файл (лог). Например:

# запускаем файл test.sh и перенаправляем весь вывод (stdout и stderr) в лог-файл
0 12 1 5 * /www/test.sh >> /tmp/log.txt 2>&1
#

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

/etc/init.d/cron restart

Кстати, чтобы просто запустить Cron и добавить его в автозагрузку (чтобы он стартовал автоматически при включении омеги), нужно выполнить из командной строки следующие команды:

/etc/init.d/cron start
/etc/init.d/cron enable

Как запускать задачи через Cron чаще 1 раза в минуту

Итак, как видите, Cron — довольно мощная штука, однако есть у него и недостатки. Одним из таких недостатков является отсутствие возможности запланировать выполнение задач чаще 1 раза в минуту. Что с этим можно сделать?

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

Пусть нам, к примеру, нужно раз в секунду запускать скрипт test.php, лежащий в папке /www.

1) Пишем скрипт demon.php (и кладём его для примера в туже папку — /www) следующего содержания:

<?php
// скрипт для бесконечных дерганий test.php с интервалом 1 секунда
error_reporting(0);     // выключаем вывод сообщений об ошибках
set_time_limit(0);      // время выполнения скрипта не ограничено
do{	// бесконечный цикл
    sleep(1);           // ждём 1 секунду
    exec('/usr/bin/php-cgi /www/test.php');
}while(true);
?>

2) Пишем скрипт turner.sh (и тоже кладём его для примера в папку /www):

#!/bin/ash
# Скрипт для периодической проверки, запущен ли демон, и его запуска, в случае, когда он не запущен
# Этот скрипт нужно запускать через cron по расписанию
# после копирования нужно открыть его в редакторе и убрать виндовые концы строк
# (если они есть) + поменять права - 'chmod +x turner.sh'
A=$(ps)
if echo $A|grep -q 'demon.php'; then
    echo "it works! do nothing"
else
    echo "it not works! starting our demon"
    /usr/bin/php-cgi /www/demon.php&   #& - запустить демона в отдельном потоке и отвязаться (чтобы этот скрипт завершился)
fi

3) Осталось только прописать запуск срипта turner.sh в Cron:

# run turner.sh
/1 * * * * /www/turner.sh
#

На этом всё.

  1. Часть 1. Первое знакомство
  2. Часть 2. Использование GPIO
  3. Часть 3. Док-плата
  4. Часть 4. Работа с файлами
  5. Часть 5. Работа с USB flash-дисками
  6. Часть 6. Установка, настройка и использование php для интерактивного взаимодействия
  7. Часть 7. Выполнение задач по расписанию с помощью планировщика Cron
  8. Часть 8. Подключаем проводной Ethernet.

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