使用python-crontab只运行一个cronjob

时间:2015-09-16 23:30:50

标签: python cron crontab

from crontab import CronTab

tab = CronTab()
cmd1 = 'actual command'

cron_job = tab.new(cmd)
cron_job.minute.every(1)
cron_job.enable()
tab.write_to_user(user=True)

我已尝试在第一分钟使用minute.at(1)运行,但我不知道在固定时间(早上6点)运行命令的正确方法,只有一次......我知道“每一个“最终重复它,但我不希望如此。需要注意的是我需要使用python-crontab。

2 个答案:

答案 0 :(得分:0)

crontab语法为:mm hh dd mt wd。因此,将其设置为每天早上6点,00 06 * * *表示任何日,月,工作日的06:00(24小时时间)。如果我正确引用documentation,这应该有效:

from crontab import CronTab

tab = CronTab()
cmd1 = 'actual command'

cron_job = tab.new(cmd)
cron_job.setall('00 06 * * *')
cron_job.enable()
tab.write_to_user(user=True)

答案 1 :(得分:0)

linux cron命令专门用于定期运行命令,而at命令用于运行一次作业,尽管如果该命令重新提交,它可以用于重复运行命令。我不知道将cron条目配置为仅执行一次的正常方法,并且找不到任何有关可能的文档。通过执行&#c; crontab -e'可以在运行后删除cron条目。编辑crontab文件,然后在编辑器中删除作业的条目,或者用crontab< crontab<覆盖crontab文件中的所有内容。的/ dev / null的'或者使用&c; crontab -r'完全删除crontab文件。

考虑到这一点,我发明了自毁的cron工作,就像这样。假设您使用用户名' adhawan将cron作业配置为您自己。使工作自毁的所有需要​​是使用以下作为工作脚本中的最后一个语句:

crontab -r

这将删除您的crontab文件,并且应该可以正常工作,因为您的个人cron作业会像您一样运行。我尝试了以下工作,它按预期工作 - 运行一次,然后自行删除!:

* * * * * echo hello > /var/tmp/cron1; crontab -r

如前所述,Linux / Unix at utility提供了一种在预定时间运行一次的方法。时间由称为timespec(时间细节)的东西指定。例如,要将作业安排在明天早上6点仅运行一次,可以使用以下timespec

6 am tomorrow

或者在9月18日上午6点进行,可以使用以下内容

6am Sep 18

或指定年份

6 am 9/18/2015

at timespec语法非常灵活。使用最近的术语,它可以称为DSL(域特定语言)。它是用YACC(另一个编译器编译器)实现的,其语法的简化版本可以在其timespec文件中看到,该文件通常安装在/ usr / share / doc / at * / timespec,并且在线有一个副本Abbreviated version of the yacc grammar used by at(1)

at可以从一个文件中运行作业,前提是它使用-f选项或stdin执行。例如,来自名为atjob的文件:

at -f atjob 6 am Sep 18

或从文件中重定向的stdin:

at 6 am Sep 18 < atjob

或来自stdin的管道:

cat atjob | at 6 am 9/18

首先尝试从命令行使用at来在不久的将来安排一个命令,比如现在或一分钟,这样你就可以看到它是否有效,并且通过一个非常简单的命令产生一些可观察的东西,比如新的文件。例如,第一个测试工作可以是“回声你好”&gt;的/ tmp / atfile01&#39;工作的第一次测试可以这样提交:

echo&#34; echo hello&gt;的/ tmp / atfile01&#34; |现在

运行之后,检查/ tmp / atfile01是否存在,如果确实存在,则证明at系统正常运行。

然后尝试安排一份工作在9月18日上午6点(或者从现在开始的几天,如果今天是9月18日或使用你的timespec)

echo&#34; echo hello&gt;的/ tmp / atfile02&#34; |在9月18日上午6点

如果没有产生错误,那么它可以运行,可以通过运行atq确认它是否列出了为YYYY-09-18 06:00安排的作业,其中YYYYY是当前年份或明年,如果今年的9/18已经过去了。

现在你知道如何在作业中编写和运行了,最好使用atq从atrm中删除任何测试作业,以列出包含其ID的作业,然后在id上执行atrm。例如,假设id为2,10和17,则atrm命令为:

atrm 2 10 17

现在修改您的work at命令以适合您的目的,并使用subprocessshenvoy从Python执行。使用suprocess的示例位于Calling an external command in Python

有关更多信息,您可以通过运行&#34; man at&#34;来查看其手册页。并且它的Ubuntu联机帮助页是at.1posix.html