Статьи

Управление заданиями Cron с помощью Python

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

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

Для просмотра заданий cron, запущенных в вашей системе, перейдите к терминалу и введите:

1
crontab -l

Приведенная выше команда отображает список заданий в файле crontab . Чтобы добавить новое задание cron в crontab , введите:

1
crontab -e

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

1
print «Hello World»

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

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

Приведенная выше строка кода планирует выполнение файла с выводом в файл с именем a.txt . Числа перед командой для выполнения определяют время выполнения задания. Синтаксис синхронизации состоит из пяти частей:

  1. минут
  2. час
  3. день месяца
  4. месяц
  5. день недели

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

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

1
pip install python-crontab

После того, как вы установили python-crontab , импортируйте его в программу python.

1
from crontab import CronTab

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

1
2
3
4
import datetime
 
with open(‘dateInfo.txt’,’a’) as outFile:
    outFile.write(‘\n’ + str(datetime.datetime.now()))

Сохраните вышеуказанные изменения.

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

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

1
from crontab import CronTab

Используя модуль CronTab , давайте перейдем к системному crontab .

1
my_cron = CronTab(user=’your username’)

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

1
2
for job in my_cron:
   print job

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

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

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

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

Как вы можете видеть в приведенной выше строке кода, я указал команду, которая будет выполняться при выполнении задания cron. Как только у вас появится новое задание cron, вам нужно запланировать задание cron.

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

1
job.minute.every(1)

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

1
my_cron.write()

Вот файл scheduleCron.py :

1
2
3
4
5
6
7
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.

1
python scheduleCron.py

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

1
crontab -l

Приведенная выше команда должна отобразить недавно добавленное задание cron.

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

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

Чтобы обновить существующее задание cron, вам нужно найти задание cron с помощью команды или идентификатора. При создании задания cron с помощью python-crontab для Id можно установить задание cron в форме комментария. Вот как вы можете создать работу cron с комментарием:

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

Как видно из приведенной выше строки кода, новое задание cron было создано с использованием комментария как dateinfo . Приведенный выше комментарий можно использовать для поиска работы cron.

Что вам нужно сделать, так это перебрать все задания в crontab и проверить работу с комментарием dateinfo . Вот код:

1
2
3
my_cron = CronTab(user=’roy’)
for job in my_cron:
    print job

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

1
2
3
4
my_cron = CronTab(user=’jay’)
for job in my_cron:
    if job.comment == ‘dateinfo’:
        print job

Как только у вас есть работа, перепланируйте работу cron и напишите cron. Вот полный код:

1
2
3
4
5
6
7
8
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 используя следующую команду:

1
crontab -l

Вы должны увидеть работу cron с обновленным расписанием.

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

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

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

1
2
3
4
5
6
7
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 без какой-либо итерации. Вот код:

1
my_cron.remove(comment=’dateinfo’)

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

1
my_cron.remove_all()

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

1
my_cron.write()

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

1
2
3
4
5
from crontab import CronTab
 
my_cron = CronTab(user=’roy’)
for job in my_cron:
    print job.frequency()

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

1
2
3
my_cron = CronTab(user=’roy’)
for job in my_cron:
    print job.frequency_per_hour()

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

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

1
pip install croniter

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

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

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

1
print sch.get_next()

Вот полный код:

1
2
3
4
5
6
7
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.

Вы использовали python-crontab или другие библиотеки для доступа к системному crontab ? Я хотел бы услышать ваши мысли. Дайте нам знать ваши предложения в комментариях ниже.

Изучите Python с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.