在本教程中,你将了解到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
的文件。执行命令前的数字定义了作业的执行时间。计时语法有五个部分:
- 分钟
- 小时
- 月的一天
- 月
- 周的一天
计时语法中的星号(*)表示每次都会运行。
介绍一下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 工作的手动过程自动化。