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