В этом уроке вы узнаете важность заданий 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 . Числа перед командой для выполнения определяют время выполнения задания. Синтаксис синхронизации состоит из пяти частей:
- минут
- час
- день месяца
- месяц
- день недели
Звездочки (*) в синтаксисе синхронизации указывают, что он будет выполняться каждый раз.
Представляем Python-Crontab
python-crontab — это модуль Python, который предоставляет доступ к заданиям cron и позволяет нам манипулировать файлом crontab из программы Python. Это автоматизирует процесс изменения файла crontab вручную. Чтобы начать работу с python-crontab , вам нужно установить модуль с помощью pip:
|
1
|
pip install python-crontab
|
После того, как вы установили python-crontab , импортируйте его в программу python.
|
1
|
from crontab import CronTab
|
Написание вашей первой работы Cron
Давайте используем модуль 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 с помощью команды или идентификатора. При создании задания 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
|
Очистка рабочих мест от Crontab
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 с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.