В этом уроке вы узнаете важность заданий 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 с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.