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

Управление Cron-задачами на Python
Управление 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 доступен по ссылке.

Автор

MIIIG

Занимаюсь разработкой сайтов, знаю php, js, html, css, gulp, bash, увлекаюсь разработкой на микроконтроллерах(esp, arduino), перевожу статьи, также увлечен графическим дизайном, типографией, знаю также немного арабский, люблю минимализм, простоту и material design