你应该使用 Python 管理 Cron 作业

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

如果大家感兴趣,请一定点个关注,给我一些动力,谢谢大家

--

原文地址:https://code.tutsplus.com/tutorials/managing-cron-jobs-using-python--cms-28231 推荐星级:✨✨✨


什么是 Crontab?

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

要查看在您的系统上运行的 cron 作业,打开您的终端并键入:

crontab -l

以上命令显示了 crontab 文件中的作业列表。如果要将新的 cron 作业添加到 crontab,请输入:

crontab -e

以上命令将显示可以用来添加计划作业的 crontab 文件。假设您有一个名为 hello.py 的文件,如下所示:

print("Hello World")

现在,要安排一个 cron 作业来执行上面的脚本来输出到另一个文件,您需要添加以下代码行:

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

上述代码行将文件的标准输出重定向到名为 a.txt 的文件中。要执行命令前面的数字定义了作业的执行时间。时序语法有五个部分:

  1. minute(分钟)
  2. hour(小时)
  3. day of month(月的第几天)
  4. month(月)
  5. day of week(一周的第几天)

时序语法中的星号「*」表示每次都会运行。


介绍一下 Python-Crontab

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

pip install python-crontab

一旦安装完成,您就可以使用下面的语句来导入它:

from crontab import CronTab

第一个 Cron 作业

我们使用 python-crontab 模块编写我们的第一个 cron 作业。 创建一个名为 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

my_cron = CronTab(user='your username')

for job in my_cron:
    print(job)

保存并执行,如果 user 指定的用户有 cron 任务的话。你应该能够看到类似的输出:

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

我们继续使用 CronTab 模块再创建一个新的 cron 作业,这次我们使用 Python 来做:

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

正如你在上面的代码行中看到的,我已经指定了执行 cron 作业时要执行的命令。接下来你需要安排 cron 在什么时间工作。

让我们安排 cron 作业每分钟运行一次。如此,在一分钟的时间间隔内,当前日期和时间将被附加到 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

更新一个已存在的 Cron 作业

要更新现有的 cron 作业,您需要使用命令或使用 ID 来查找 cron 作业。 使用 python-crontab 创建 cron 作业时,您可以将 ID 设置为注释形式。以下是如何创建一个带有注释的 cron 作业:

job = my_cron.new(command='python /home/kevin/writeDate.py',
                  comment='dateinfo')

正如在上面的代码行中看到的,我们使用注释 dateinfo 创建了一个新的 cron 作业。注释可以用来查找 cron 作业。

你需要做的是遍历 crontab 中的所有作业,并用注释 dateinfo 过滤那些作业。这里是代码:

my_cron = CronTab(user='kevin')

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

一旦你找到这份作业,重新安排 cron 作业并写入 cron。这里是完整的代码:

from crontab import CronTab

my_cron = CronTab(user='kevin')

for job in my_cron:
    if job.comment == 'dateinfo':
        job.hour.every(10)
        my_cron.write()
        print('Cron job modified successfully')

结果如下:

* */10 * * * python /home/kevin/writeDate.py # dateinfo

从 Crontab 中清除作业

您可以根据计划,注释或命令从 crontab 中删除 cron 作业。

from crontab import CronTab

my_cron = CronTab(user='kevin')

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()

最后,完成更改后,别忘了使用以下命令将其写回到 crontab:

my_cron.write()

计算作业的频率

要检查使用 python-crontab 执行的作业的次数,可以使用 frequency 方法返回一年内执行工作的次数。

from crontab import CronTab

my_cron = CronTab(user='kevin')

for job in my_cron:
    print(job.frequency())

要检查一小时内执行作业的次数,可以使用 frequency_per_hour 方法。

my_cron = CronTab(user='kevin')

for job in my_cron:
    print(job.frequency_per_hour())

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


检查作业时间表

python-crontab 提供了检查特定作业的时间表的功能。但是它有个依赖,您需要安装 croniter。 使用 pip 安装 croniter:

pip install croniter

一旦你安装了 croniter,调用作业的 schedule 方法来获取作业计划。

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

您可以使用 get_next 方法获得下一个工作计划。

print(sch.get_next())

完整代码:

import datetimefrom crontab import CronTab

my_crons = CronTab(user='kevin')

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 作业。

原文发布于微信公众号 - 随心DevOps(heart-devops)

原文发表时间:2018-02-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

HTTP协议简介

前言 本文摘录自 RFC 2616(HTTP/1.1 协议文档),如想查阅1.0版本协议请参见(RFC1945)。 本文档主版本为英文,有中译可参考。 相关地址...

1840
来自专栏Coco的专栏

【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

1543
来自专栏企鹅号快讯

网站出现“Service Unavailable”提示该如何解决

为什么网站会出现“ServiceUnavailable”的提示? ? 出现这种情况是由于您的空间超过了系统分配的资源限制,主要是CPU资源,或者IIS连接数超过...

17211
来自专栏抠抠空间

数据库简介

一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上。 如果我们暂且忽略直接基于文件来存...

3147
来自专栏网站那些事

利用MailChimp发送邮件加调取API开发落地页分享

基于平时爱好关注各类技术社区及众多技术微信号,经常看到很多有用有意思的内容,朋友总是让分享出来,索性就抽空做了个邮件订阅页面

38414
来自专栏Vamei实验室

Linux用户与“最小权限”原则

Linux的用户在登录(login)之后,就带有一个用户身份(user ID, UID)和一个组身份(group ID, GID)。在Linux文件管理背景知识...

2099
来自专栏木宛城主

SharePoint 2010、2013多个域之间互信(Domain Trust)的设计与实施

在现实的业务场景中,有时为了更好的管理域用户和服务。我们往往会创建多个分散式的域,每个域的Administrator专注于维护特定域中的用户和资源,Admin...

1869
来自专栏数据和云

数据恢复-SQL被注入攻击程序的应对策略(ORA-16703)

前几天某客户紧急求助我们,其Oracle数据库由于重启之后无法正常启动。最后通过数据库全备进行了一天一夜的恢复,最后仍然无法正常打开数据库。 alter dat...

3396
来自专栏开源优测

移动测试Appium之webelement模块介绍

移动测试Appium之webelement模块介绍 前言 本文主要分析Appium Python端所提供的移动端元素操作API,其主要实现,你可以通过以下方式查...

2485
来自专栏专知

Python网络爬虫与信息抽取笔记02 requests库入门

1414

扫描关注云+社区