如何使用Python管理Cron作业

335 阅读6分钟

在本教程中,你将了解到cron作业的重要性,以及为什么你需要它们。你将看到python-crontab ,一个与crontab 互动的 Python 模块。你将学习如何使用python-crontab 模块从 Python 程序中操作 cron jobs。

什么是 Cron?

在系统管理中,有必要在服务器上运行后台作业来执行常规任务。Cron是一个系统进程,它被用来执行常规的后台任务。Cron需要一个名为crontab 的文件,其中包含了在特定时间要执行的任务列表。所有这些工作都会在指定的时间在后台执行。

要查看在你的系统上运行的cron作业,请导航到你的终端并输入

crontab -l

上述命令显示了crontab 文件中的工作列表。要添加一个新的cron作业到crontab ,键入

crontab -e

上面的命令将显示crontab 文件,你可以在其中安排一个工作。假设你有一个名为hello.py 的文件,看起来像

print("Hello World")

现在,要安排一个cron job来执行上述脚本,输出到另一个文件,你需要添加以下一行代码。

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

上面这行代码安排执行该文件,输出到一个叫做a.txt 的文件。执行命令前的数字定义了作业的执行时间。计时语法有五个部分:

  1. 分钟
  2. 小时
  3. 月的一天
  4. 周的一天

计时语法中的星号(*)表示每次都会运行。

介绍一下Python-Crontab

python-crontab 是一个Python模块,它提供了对cron作业的访问,使我们能够从Python程序中操作 文件。它将手动修改 文件的过程自动化。要开始使用 ,你需要用pip安装该模块。crontab crontab python-crontab

pip install python-crontab

一旦你安装了python-crontab ,就把它导入到Python程序中。

from crontab import CronTab

编写你的第一个Cron作业

让我们使用python-crontab 模块来编写我们的第一个 cron job。创建一个名为writeDate.py 的 Python 程序。在writeDate.py 中,添加代码来打印当前的日期和时间到一个文件。下面是writeDate.py 的样子。

import datetime

with open('dateInfo.txt','a') as outFile:
    outFile.write('\n' + str(datetime.datetime.now()))

保存上述改动。

让我们创建另一个 Python 程序,它将安排writeDate.py Python 程序每分钟运行一次。创建一个名为scheduleCron.py 的文件。

CronTab 模块导入scheduleCron.py 程序中。

from crontab import CronTab

使用CronTab 模块,让我们访问系统crontab

my_cron = CronTab(user='your username')

上面的命令创建了一个访问用户的系统crontab 。让我们遍历一下cron jobs,你应该能够看到任何为该特定用户名手动创建的cron jobs。

for job in my_cron:
    print(job)

保存更改并尝试执行scheduleCron.py ,你应该能看到特定用户的cron作业的列表,如果有的话。在执行上述程序时,你应该能够看到类似的东西。

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

让我们继续使用CronTab 模块来创建一个新的cron job。你可以通过使用new方法和指定要执行的命令来创建一个新的cron。

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

正如你在上面一行代码中看到的,我已经指定了在执行cron job时要执行的命令。一旦你有了新的cron job,你需要安排这个cron job。

让我们把这个cron job安排在每分钟运行一次。因此,在一分钟的间隔内,当前的日期和时间将被附加到dateInfo.txt 文件中。要安排每分钟的工作,请添加以下一行代码。

job.minute.every(1)

一旦你安排了工作,你需要把工作写到cron标签上。

my_cron.write()

这里是scheduleCron.py 文件。

from crontab import CronTab

my_cron = CronTab(user='vaati')
job = my_cron.new(command='python3 /home/Desktop/vaati/writeDate.py')
job.minute.every(1)

my_cron.write()

保存上述修改并执行Python程序。

python scheduleCron.py

一旦它被执行,使用以下命令检查crontab 文件。

crontab -l

上面的命令应该显示新添加的cron job。

* * * * * python3 home/vaati/Desktop/writeDate.py

等待一分钟,检查你的主目录,你应该能够看到带有当前日期和时间的dateInfo.txt 文件。这个文件每分钟都会被更新,当前的日期和时间会被附加到现有的内容上。

更新一个现有的Cron Job

要更新一个现有的cron job,你需要使用命令或通过Id找到这个cron job。在使用python-crontab 创建一个cron job时,你可以以注释的形式为一个cron job设置一个Id。下面是你如何创建一个带有注释的cron job。

job = my_cron.new(command='python3 home/vaati/Desktop/writeDate.py', comment='dateinfo')

从上面一行代码中可以看出,一个新的cron job已经用注释的形式创建了dateinfo 。上面的注释可以用来查找cron job。

你需要做的是遍历crontab 中的所有工作,并检查带有注释的工作dateinfo 。以下是代码。

 my_cron = CronTab(user='vaati')
 for job in my_cron:
     print(job)

使用job.comment 属性检查每个工作的注释。

 my_cron = CronTab(user='vaati')
 for job in my_cron:
     if job.comment == 'dateinfo':
         print(job)

一旦你有了这个工作,重新安排cron工作,并写入cron。这里是完整的代码。

from crontab import CronTab

my_cron = CronTab(user='vaati')
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

你应该能够看到带有更新的计划时间的cron工作。

* */10 * * * python3 /home/Desktop/vaati/writeDate.py # dateinfo

从Crontab中清除工作

python-crontab 提供了从 中清除或删除工作的方法。你可以根据时间表、注释或命令从 中删除一个cron工作。crontab crontab

比方说,你想从crontab 中清除带有注释的工作dateinfo 。代码将是这样的。

from crontab import CronTab

my_cron = CronTab(user='vaati')
for job in my_cron
    if job.comment == 'dateinfo':
        my_cron.remove(job)
        my_cron.write()

my_cron 同样地,要根据注释删除一个工作,你可以直接调用remove 方法,而不需要任何迭代。下面是代码。

my_cron.remove(comment='dateinfo')

要从crontab 中删除所有的工作,你可以调用remove_all 方法。

my_cron.remove_all()

一旦完成了修改,使用下面的命令将其写回cron中。

my_cron.write()

计算作业频率

要使用python-crontab ,检查你的工作被执行的次数,你可以使用frequency 方法。一旦你有了工作,你可以调用名为frequency 的方法,它将返回工作在一年中被执行的次数。

from crontab import CronTab

my_cron = CronTab(user='vaati')
for job in my_cron:
    print(job.frequency())

要检查工作在一小时内被执行的次数,你可以使用方法frequency_per_hour

my_cron = CronTab(user='vaati')
for job in my_cron:
    print(job.frequency_per_hour())

要检查一天内的工作频率,你可以使用方法frequency_per_day

检查工作时间表

python-crontab 提供了检查某个特定工作的时间表的功能。为了实现这个功能,你需要在你的系统上安装 模块。使用pip安装 。croniter croniter

pip install croniter

一旦你安装了croniter ,在作业上调用schedule方法以获得作业时间表。

import datetime

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

现在你可以通过使用get_next 方法获得下一个工作时间表。

print(sch.get_next())

这里是完整的代码。

import datetime
from crontab import CronTab

my_crons = CronTab(user='vaati')
for job in my_crons:
    sch = job.schedule(date_from=datetime.datetime.now())
    print(sch.get_next())

你甚至可以通过使用get_prev 方法获得以前的时间表。

总结

在本教程中,你看到了如何开始使用python-crontab 从一个 Python 程序访问系统crontab 。使用python-crontab ,你可以将创建、更新和调度 cron 工作的手动过程自动化。