27.03.2017 2219 0

Управление Cron-задачами на Python

В этой статье вы узнаете, почему так важно планирование задач с использованием cron. Также вы познакомитесь с python-crontab — модулем, написанным на языке Python, который позволяет взаимодействовать с crontab. Вы научитесь писать программы, которые управляют cron-задачами.

Что такое Cron?

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

Чтобы посмотреть задачи cron, запущенные в вашей системе, наберите в терминале:

crontab -l

Эта команда выводит список задач в файле crontab. Чтобы добавить новую задачу, введите:

crontab -e

Эта команда выведет файл crontab, где вы сможете добавить в расписание новую задачу. Допустим, у вас есть файл hello.py, который выглядит следующим образом:

print "Hello World"

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

50 19 * * * python hello.py >> a.txt

Этот код добавляет в расписание выполнение скрипта с выводом в файл a.txt. Цифры перед выполняемой командой задают время выполнения задачи. Синтаксис времени имеет 5 частей:

  • минута
  • час
  • день месяца
  • месяц
  • день недели

Звездочки (*) означают, что задача должна запускаться при любом значении этой еденицы времени.

Представляем Python-Crontab

Python-crontab — это модуль на языке Python, который предоставляет доступ к задачам cron и дает возможность управлять файлом crontab прямо из программы. Он автоматизирует процесс изменения файла crontab. Чтобы начать работу с python-crontab, вам нужно установить модуль используя pip:

pip install python-crontab

После установки, вы можете импортировать его в свою программу:

from crontab import CronTab

Создание задачи cron

Давайте напишем нашу первую cron-задачу. Создайте программу на Python с именем writeData.py. Внутри writeData.py добавьте код, который будет записывать текущее время и дату в другой файл. Вот как будет выглядеть наш код:

import datetime

with open('dateInfo.txt','a') as outFile:
    outFile.write('\n' + str(datetime.datetime.now()))

Сохраните изменения.

Давайте теперь создадим другую программу, которая будет добавлять в расписание программу writeData.py, чтобы она запускалась каждую минуту. Создайте файл scheduleCron.py.

Импортируйте модуль в scheduleCron.py.

from crontab import CronTab

Используя модуль CronTab, подключитесь в системе crontab.

my_cron = CronTab(user='your username')

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

for job in my_cron:
    print job

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

50 19 * * * python hello.py >> a.txt # at 5 a.m every week with:

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

job = my_cron.new(command='python /home/jay/writeDate.py')

После того как вы создали новую задачу, вам нужно добавить ее в расписание.

Давайте добавим в расписание задачу, чтобы она запускалась каждую минуту. Таким образом, с интервалом в одну минуту в файл dateInfo.txt будет добавляться текущая дата и время. Чтобы запланировать задачу на выполнение каждую минуту, добавьте следующую строку кода:

job.minute.every(1)

Теперь, когда вы запланировали задачу, вам нужно записать ее в crontab.

my_cron.write()

Вот полное содержимое файла scheduleCron.py:

from crontab import CronTab

my_cron = CronTab(user='roy')
job = my_cron.new(command='python /home/roy/writeDate.py')
job.minute.every(1)

my_cron.write()

Сохраните изменения и запустите программу.

python scheduleCron.py

Когда она будет запущена, проверьте файл crontab, при помощи следующей команды:

crontab -l

Эта команда должна вывести только что добавленную задачу.

* * * * * python /home/roy/writeDate.py

Подождите минуту и проверьте вашу корневую директорую. Вы должны увидеть файл dateInfo.txt с текущей датой и временем. Этот файл будет обновляться каждую минуту, и новые данные будут добавляться в конец имеющегося содержимого.

Редактирование существующей задачи cron

Чтобы отредактировать существующую задачу, вам нужно найти её по команде или по Id. Вы можете добавить Id к задаче в виде комментария, когда её создаете. Вот как вы можете это сделать:

job = my_cron.new(command='python /home/roy/writeDate.py', comment='dateinfo')

Как видно из этого кода, новая задача была создана с коментарием dateinfo. Этот коментарий может быть использован для поиска задачи.

Вам нужно пройти циклом все задачи в crontab и проверить присутствие коментария dateinfo. Вот код:

my_cron = CronTab(user='roy')
for job in my_cron:
    print job

Проверяем коментарий каждой задачи используя свойство job.comment.

my_cron = CronTab(user='jay')
for job in my_cron:
    if job.comment == 'dateinfo':
        print job

После того как вы нашли задачу, запланируйте её заново и запишите в cron. Вот окончательный код:

from crontab import CronTab

my_cron = CronTab(user='roy')
for job in my_cron:
    if job.comment == 'dateinfo':
    job.hour.every(10)
    my_cron.write()
    print 'Cron job modified successfully'

Сохраните изменения и запустите scheduleCron.py. Получите список элементов в файле crontab, используя следующую команду:

crontab -l

Вы должны увидеть задачу с отредактированным временем.

* */10 * * * python /home/jay/writeDate.py # dateinfo

Удаление задач из crontab

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

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

from crontab import CronTab

my_cron = CronTab(user='roy')
for job in my_cron
    if job.comment == 'dateinfo':
        my_cron.remove(job)
        my_cron.write()

Также, чтобы удалить задачу с заданным коментарием, вы можете напрямую вызвать метод remove на my_cron безо всяких циклов. Вот код:

my_cron.remove(comment='dateinfo')

Чтобы удалить все задачи из crontab, вы можете вызвать метод remove_all.

my_cron.remove_all()

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

my_cron.write()

Получение частоты выполнения задачи

Чтобы узнать при помощи python-crontab, как часто ваша задача запускается, вы можете использовать метод frequency. Получив задачу, вы можете вызвать этот метод, который вернет число выполнений этой задачи в течение года.

from crontab import CronTab

my_cron = CronTab(user='roy')
for job in my_cron:
    print job.frequency()

Чтобы получить количество вызовов в течение часа, вы можете использовать метод frequency_per_hour.

my_cron = CronTab(user='roy')
for job in my_cron:
    print job.frequency_per_hour()

Аналогично, для получения частоты в день, вы можете использовать метод frequency_per_day.

Проверка расписания задачи

Python-crontab предоставляет функциональность для проверки расписания конкретной задачи. Чтобы это работало, вам нужно установить модуль croniter используя pip:

pip install croniter

После этого вызовите метод schedule на задаче, чтобы получить ее расписание:

sch = job.schedule(date_from=datetime.datetime.now())

Теперь вы можете получить расписание следующей задачи используя метод get_next.

print sch.get_next()

В итоге должен получиться вот такой код:

import datetime
from crontab import CronTab

my_crons = CronTab(user='jay')
for job in my_crons:
    sch = job.schedule(date_from=datetime.datetime.now())
    print sch.get_next()

Для получения предыдущей задачи вы можете использовать метод get_prev.

Подведем итоги

В этой статье вы увидели, как пользоваться python-crontab для подключения к системному crontab из программы на языке Python. Используя python-crontab вы можете автоматизировать процесс создания, редактирования и планирования задач cron.

Пользовались ли вы этим или каким-нибудь другим модулем для работы с crontab? Пишите в комментариях, я буду рад услышать ваше мнение.

Статью перевел aziev. Оригинал на Code.tutsplus.com доступен по ссылке.