首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只运行一个使用python-crontab的cronjob

只运行一个使用python-crontab的cronjob
EN

Stack Overflow用户
提问于 2015-09-17 07:30:50
回答 2查看 2.3K关注 0票数 0
代码语言:javascript
运行
复制
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。

EN

回答 2

Stack Overflow用户

发布于 2015-09-17 07:49:45

crontab的语法是:mm hh dd mt wd。因此,如果将其设置为每天早上6点,它将是00 06 * * *,意思是任何一天、月份或工作日的06:00 (24小时时间)。如果我正确地引用了documentation,这应该是可行的:

代码语言:javascript
运行
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2015-09-17 13:35:54

linux cron命令专为定期运行命令而设计,而at命令用于运行一次作业,但如果该命令重新提交自身,则可以使用它重复运行该命令。我不知道将cron条目配置为只执行一次的正常方法,也找不到任何有关这种情况的文档。可以通过执行'crontab -e‘来编辑crontab文件,然后在编辑器中删除该作业的条目,或者通过使用'crontab < /dev/null’覆盖crontab文件中的所有内容,或者通过使用'crontab -r‘完全删除crontab文件,来删除运行后的cron条目。

考虑到这一点,我发明了自毁cron作业,它是这样的。假设您使用用户名'adhawan‘以您自己的身份配置了一个cron作业。要使作业自销毁,只需使用以下语句作为作业脚本中的最后一条语句:

代码语言:javascript
运行
复制
crontab -r

这将删除您的crontab文件,并且应该可以工作,因为您的个人cron作业是以您的身份运行的。我在下面的作业中尝试了它,它像预期的那样工作-运行一次,然后自动删除!

代码语言:javascript
运行
复制
* * * * * echo hello > /var/tmp/cron1; crontab -r

如前所述,Linux/Unix at实用程序提供了一种在预定时间运行某项操作的方法。时间是用一个叫做timespec (时间规范)的东西来指定的。例如,若要将作业安排为仅在明天上午6点运行一次,则可以使用以下timespec

代码语言:javascript
运行
复制
6 am tomorrow

或者在9月18日上午6点执行此操作,可以使用以下命令

代码语言:javascript
运行
复制
6am Sep 18

或者还可以指定年份

代码语言:javascript
运行
复制
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)

如果使用-f选项或从标准输入执行作业,则at可以让作业从文件运行。例如,来自名为atjob的文件:

代码语言:javascript
运行
复制
at -f atjob 6 am Sep 18

或来自标准输入,并从文件重定向:

代码语言:javascript
运行
复制
at 6 am Sep 18 < atjob

或者使用管道从stdin:

代码语言:javascript
运行
复制
cat atjob | at 6 am 9/18

首先尝试从命令行使用at,以便在不久的将来调度命令,比如现在或立即,这样您就可以查看它是否有效,并使用一个非常简单的命令生成一些可观察到的内容,如新文件。例如,第一个测试作业可以是'echo hello > /tmp/atfile01‘,第一个测试at作业可以像这样提交:

echo "echo hello > /tmp/atfile01“|现在

运行该命令后,检查/tmp/atfile01是否存在,如果存在,则证明at系统可操作。

然后尝试调度作业在9月18日上午6点运行(如果今天是9月18日,则在几天后运行,或者使用您的timespec)。

echo "echo hello > /tmp/atfile02“|9月18日早上6点

如果没有产生错误,那么它可以工作,这可以通过运行atq来确认,并查看它是否列出了YYYY-09-18 06:00的调度作业,其中YYYY是本年度,如果今年的9/18已经过去,则是明年。

现在,您知道了如何编写和运行at作业,最好使用atrm从at队列中删除任何测试作业,使用atq列出作业,包括它们的ids,然后对这些ids执行atrm。例如,假设ids为2、10和17,atrm命令将为:

代码语言:javascript
运行
复制
atrm 2 10 17

现在修改working at命令以满足您的需要,并使用subprocessshenvoy在Python中执行它。使用suprocess的例子在Calling an external command in Python

有关at的更多信息,可以通过运行"man at“查看它的手册页,其Ubuntu手册页是at.1posix.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32620394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档