Что такое Кронтаб
Cron - это программная утилита, которая позволяет нам планировать задачи в Unix-подобных системах. Название происходит от греческого слова «Хронос», что означает «время».
Задачи в Cron определены в crontab, который представляет собой текстовый файл, содержащий команды, которые необходимо выполнить. Синтаксис, используемый в crontab, описан ниже в этой статье.
Python представляет нам модуль crontab для управления запланированными заданиями через Cron. Доступные в нем функции позволяют нам получать доступ к Cron, создавать задания, устанавливать ограничения, удалять задания и многое другое. В этой статье мы покажем, как использовать эти операции из вашего кода Python.
Для заинтересованного читателя официальную страницу справки можно найти по адресу https://pypi.python.org/pypi/python-crontab .
Синтаксис Crontab
Cron использует особый синтаксис для определения расписания. Он состоит из пяти полей, разделенных пробелами. Поля:
Minute Hour Day Month Day_of_the_Week
Поля могут иметь следующие значения:
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday;
│ │ │ │ │ 7 is also Sunday on some systems)
│ │ │ │ │
│ │ │ │ │
* * * * * command to execute
[Источник: Википедия. Cron. Доступно на https://en.wikipedia.org/wiki/Cron]{.small}
Cron также принимает специальные символы, поэтому вы можете создавать более сложные расписания. Специальные символы имеют следующие значения:
Персонаж Имея в виду
Запятая Чтобы разделить несколько значений Дефис Чтобы указать диапазон значений Звездочка Чтобы указать все возможные значения Косая черта Для обозначения КАЖДОГО
Давайте посмотрим на несколько примеров:
* * * * *
означает: каждую минуту каждого часа каждого дня месяца для каждого месяца для каждого дня недели.0 16 1,10,22 * *
указывает cron запускать задачу в 16:00 (16-й час) 1-го, 10-го и 22-го числа каждого месяца.
Установка Crontab
Crontab не входит в стандартную установку Python. Таким образом, первое, что нам нужно сделать, это установить его.
Это делается с помощью команды pip
Единственное, что следует
учитывать, это то, что имя модуля - «python-crontab», а не просто
«crontab». Следующая команда установит пакет на наш компьютер:
$ pip install python-crontab
Получение доступа к Crontab
Согласно справочной странице crontab, есть пять способов включить задание в cron. Из них три работают только в Linux, а два можно использовать и в Windows.
Первый способ получить доступ к cron - использовать имя пользователя. Синтаксис следующий:
cron = CronTab(user='username')
Два других способа Linux:
cron = CronTab()
# or
cron = CronTab(user=True)
Есть еще два синтаксиса, которые также будут работать в Windows.
В первом мы вызываем задачу, определенную в файле "filename.tab":
cron = CronTab(tabfile='filename.tab')
Во втором мы определяем задачу согласно синтаксису cron:
cron = CronTab(tab="""* * * * * command""")
Создание новой работы
После того, как мы получили доступ к cron, мы можем создать новую задачу, используя следующую команду:
cron.new(command='my command')
Здесь my command
определяет задачу, которая будет выполняться через
командную строку.
Мы также можем добавить комментарий к нашей задаче. Синтаксис следующий:
cron.new(command='my command', comment='my comment')
Посмотрим на это на примере:
from crontab import CronTab
cron = CronTab(user='username')
job = cron.new(command='python example1.py')
job.minute.every(1)
cron.write()
В приведенном выше коде мы сначала получили доступ к cron через имя
пользователя, а затем создали задание, состоящее из запуска скрипта
Python с именем example1.py. Кроме того, мы поставили задачу запускаться
каждую минуту. Функция write()
добавляет нашу работу в cron.
Скрипт example1.py выглядит следующим образом:
from datetime import datetime
myFile = open('append.txt', 'a')
myFile.write('\nAccessed on ' + str(datetime.now()))
Как видно из приведенного выше кода, программа откроется и добавит фразу «Доступ открыт» с добавленными датой и временем доступа.
Результат такой:
{.ezlazyload .img-responsive}
фигура 1
Как мы и ожидали, на экране 1 показано, что программа обратилась к файлу. Он продолжит выполнение поставленной задачи, пока программа example1.py работает в cron.
После доступа к cron мы можем добавить более одного задания. Например, следующая строка в приведенном выше примере добавит вторую задачу для управления cron:
job2 = cron.new(command='python example2.py')
После добавления новой задачи мы можем установить ограничения для каждой из них.
Установка ограничений
Одним из основных преимуществ использования модуля crontab Python является то, что мы можем установить временные ограничения без использования синтаксиса cron.
В приведенном выше примере мы уже видели, как настроить выполнение задания каждую минуту. Синтаксис следующий:
job.minute.every(minutes)
Аналогичным образом мы можем настроить часы:
job.hour.every(hours)
Также мы можем настроить выполнение задачи в определенные дни недели. Например:
job.dow.on('SUN')
Приведенный выше код сообщает cron, что нужно запускать задачу по воскресеньям, а следующий код сообщает cron о том, что задача должна быть запланирована на воскресенье и пятницу:
job.dow.on('SUN', 'FRI')
Точно так же мы можем указать cron запускать задачу в определенные месяцы. Например:
job.month.during('APR', 'NOV')
Это скажет cron запустить программу в апреле и ноябре.
Важно учитывать, что каждый раз, когда мы устанавливаем ограничение по времени, мы обнуляем предыдущее. Так, например:
job.hour.every(5)
job.hour.every(7)
Приведенный выше код установит окончательное расписание на запуск каждые семь часов, отменяя предыдущее пятичасовое расписание.
Если только мы не добавим расписание к предыдущему, например:
job.hour.every(15)
job.hour.also.on(3)
Это установит расписание на каждые 15 часов и на 3 часа ночи.
Условие «каждый» иногда может сбивать с толку. Если мы напишем
job.hour.every(15)
, это будет эквивалентно * */15 * * *
. Как
видим, протокол не претерпел изменений.
Если мы хотим установить поле минут в ноль, мы можем использовать следующий синтаксис:
job.every(15).hours()
Это установит расписание на 0 */4 * * *
. Аналогично для полей «день
месяца», «месяц» и «день недели».
Примеры:
job.every(2).month
эквивалентен0 0 0 */2 *
аjob.month.every(2)
эквивалентен* * * */2 *
job.every(2).dows
эквивалентен0 0 * * */2
аjob.dows.every(2)
эквивалентен* * * * */2
Мы можем увидеть различия в следующем примере:
from crontab import CronTab
cron = CronTab(user='username')
job1 = cron.new(command='python example1.py')
job1.hour.every(2)
job2 = cron.new(command='python example1.py')
job2.every(2).hours()
for item in cron:
print item
cron.write()
После запуска программы результат будет следующим:
$ python cron2.py
* */2 * * * python /home/eca/cron/example1.py
0 */2 * * * python /home/eca/cron/example1.py
$
фигура 2
Как видно на рисунке 2 , программа установила минуты второй задачи равными нулю и определила минуты первой задачи до значения по умолчанию.
Наконец, мы можем настроить выполнение задачи каждый раз при загрузке нашей машины. Синтаксис следующий:
job.every_reboot()
Клиринговые ограничения
Мы можем снять все ограничения задачи с помощью следующей команды:
job.clear()
В следующем коде показано, как использовать указанную выше команду:
from crontab import CronTab
cron = CronTab(user='username')
job = cron.new(command='python example1.py', comment='comment')
job.minute.every(5)
for item in cron:
print item
job.clear()
for item in cron:
print item
cron.write()
После запуска кода получаем следующий результат:
$ python cron3.py
*/5 * * * * python /home/eca/cron/example1.py # comment
* * * * * python /home/eca/cron/example1.py # comment
Рисунок 3
Как видно на рисунке 3 , расписание изменилось с каждых 5 минут на настройку по умолчанию.
Включение и отключение задания
Задачу можно включить или отключить с помощью следующих команд:
Чтобы включить задание:
job.enable()
Чтобы отключить задание:
job.enable(False)
Чтобы проверить, включена или отключена задача, мы можем использовать следующую команду:
job.is_enabled()
В следующем примере показано, как включить и отключить ранее созданное задание и проверить оба состояния:
from crontab import CronTab
cron = CronTab(user='username')
job = cron.new(command='python example1.py', comment='comment')
job.minute.every(1)
cron.write()
print job.enable()
print job.enable(False)
Результат такой:
$ python cron4.py
True
False
Рисунок 4
Проверка действительности
Мы можем легко проверить, действительна ли задача, с помощью следующей команды:
job.is_valid()
В следующем примере показано, как использовать эту команду:
from crontab import CronTab
cron = CronTab(user='username')
job = cron.new(command='python example1.py', comment='comment')
job.minute.every(1)
cron.write()
print job.is_valid()
После запуска вышеуказанной программы мы получаем подтверждение, как показано на следующем рисунке:
$ python cron5.py
True
Рисунок 5.
Список всех заданий Cron
Все задания cron, включая отключенные, могут быть перечислены с помощью следующего кода:
for job in cron:
print job
Добавление этих строк кода в наш первый пример покажет нашу задачу, напечатав на экране следующее:
$ python cron6.py
* * * * * python /home/eca/cron/example1.py
Рисунок 6
Поиск работы
Модуль crontab Python также позволяет нам искать задачи на основе критерия выбора, который может быть основан на команде, комментарии или запланированном времени. Синтаксисы различаются для каждого случая.
Найдите по команде:
cron.find_command("command name")
Здесь «имя команды» может быть частичным совпадением или регулярным выражением.
Найдите по комментарию:
cron.find_comment("comment")
Найдите по времени:
cron.find_time(time schedule)
В следующем примере показано, как найти ранее определенную задачу в соответствии с тремя ранее упомянутыми критериями:
from crontab import CronTab
cron = CronTab(user='username')
job = cron.new(command='python example1.py', comment='comment')
job.minute.every(1)
cron.write()
iter1 = cron.find_command('exam')
iter2 = cron.find_comment('comment')
iter3 = cron.find_time("*/1 * * * *")
for item1 in iter1:
print item1
for item2 in iter2:
print item2
for item3 in iter3:
print item3
В результате одна и та же вакансия отображается трижды:
$ python cron7.py
* * * * * python /home/eca/cron/example1.py # comment
* * * * * python /home/eca/cron/example1.py # comment
* * * * * python /home/eca/cron/example1.py # comment
Рисунок 7
Как видите, он каждый раз правильно находит команду cron.
Удаление заданий
Каждое задание можно удалить отдельно. Синтаксис следующий:
cron.remove(job)
В следующем коде показано, как удалить ранее созданную задачу. Программа сначала создает задачу. Затем он перечисляет все задачи, показывая только что созданную. После этого он удаляет задачу и показывает получившийся пустой список.
from crontab import CronTab
cron = CronTab(user='username')
job = cron.new(command='python example1.py')
job.minute.every(1)
cron.write()
print "Job created"
# list all cron jobs (including disabled ones)
for job in cron:
print job
cron.remove(job)
print "Job removed"
# list all cron jobs (including disabled ones)
for job in cron:
print job
Результат такой:
$ python cron8.py
Job created
* * * * * python /home/eca/cron/example1.py
Job removed
Рисунок 8
Задания также могут быть удалены в зависимости от условия. Например:
cron.remove_all(comment='my comment')
Это удалит все вакансии, в которых comment='my comment'
.
Очистка всех заданий
Все задания cron можно удалить сразу, используя следующую команду:
cron.remove_all()
В следующем примере удаляются все задания cron и отображается пустой список.
from crontab import CronTab
cron = CronTab(user='username')
cron.remove_all()
# list all cron jobs (including disabled ones)
for job in cron:
print job
Переменные окружающей среды
Мы также можем определить переменные среды, специфичные для нашей запланированной задачи, и показать их на экране. Переменные сохраняются в словаре. Синтаксис для определения новой переменной окружения следующий:
job.env['VARIABLE_NAME'] = 'Value'
Если мы хотим получить значения для всех переменных среды, мы можем использовать следующий синтаксис:
job.env
В приведенном ниже примере определяются две новые переменные среды для задачи «пользователь» и их значение отображается на экране. Код выглядит следующим образом:
from crontab import CronTab
cron = CronTab(user='username')
job = cron.new(command='python example1.py')
job.minute.every(1)
job.env['MY_ENV1'] = 'A'
job.env['MY_ENV2'] = 'B'
cron.write()
print job.env
После запуска указанной выше программы получаем следующий результат:
$ python cron9.py
MY_ENV1=A
MY_ENV2=B
Рисунок 9
Кроме того, переменные среды уровня Cron хранятся в cron.env.
Заключение
Модуль crontab Python предоставляет нам удобный инструмент для программного управления нашим приложением cron, доступным для Unix-подобных систем. Используя его, вместо того, чтобы полагаться на создание crontab, мы можем использовать код Python для управления частыми задачами.
Модуль довольно полный. Несмотря на некоторую критику его поведения, он содержит функции для подключения к cron, создания запланированных задач и управления ими. Как показано в приведенных выше примерах, их использование довольно прямое. Таким образом, он предоставляет инструмент, позволяющий создавать сложные сценарии с основной характеристикой Python: простотой.