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。
发布于 2015-09-17 07:49:45
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)发布于 2015-09-17 13:35:54
linux cron命令专为定期运行命令而设计,而at命令用于运行一次作业,但如果该命令重新提交自身,则可以使用它重复运行该命令。我不知道将cron条目配置为只执行一次的正常方法,也找不到任何有关这种情况的文档。可以通过执行'crontab -e‘来编辑crontab文件,然后在编辑器中删除该作业的条目,或者通过使用'crontab < /dev/null’覆盖crontab文件中的所有内容,或者通过使用'crontab -r‘完全删除crontab文件,来删除运行后的cron条目。
考虑到这一点,我发明了自毁cron作业,它是这样的。假设您使用用户名'adhawan‘以您自己的身份配置了一个cron作业。要使作业自销毁,只需使用以下语句作为作业脚本中的最后一条语句:
crontab -r这将删除您的crontab文件,并且应该可以工作,因为您的个人cron作业是以您的身份运行的。我在下面的作业中尝试了它,它像预期的那样工作-运行一次,然后自动删除!
* * * * * echo hello > /var/tmp/cron1; crontab -r如前所述,Linux/Unix at实用程序提供了一种在预定时间运行某项操作的方法。时间是用一个叫做timespec (时间规范)的东西来指定的。例如,若要将作业安排为仅在明天上午6点运行一次,则可以使用以下timespec
6 am tomorrow或者在9月18日上午6点执行此操作,可以使用以下命令
6am Sep 18或者还可以指定年份
6 am 9/18/2015at的timespec语法非常灵活。使用最近的术语,它可以被称为DSL (领域特定语言)。它是用YACC (另一个编译器)实现的,其语法的简化版本可以在它的timespec文件中看到,该文件通常安装在/usr/share/doc/ at */timespec,在线上有它的副本在Abbreviated version of the yacc grammar used by at(1)。
如果使用-f选项或从标准输入执行作业,则at可以让作业从文件运行。例如,来自名为atjob的文件:
at -f atjob 6 am Sep 18或来自标准输入,并从文件重定向:
at 6 am Sep 18 < atjob或者使用管道从stdin:
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命令将为:
atrm 2 10 17现在修改working at命令以满足您的需要,并使用subprocess、sh或envoy在Python中执行它。使用suprocess的例子在Calling an external command in Python。
有关at的更多信息,可以通过运行"man at“查看它的手册页,其Ubuntu手册页是at.1posix.html。
https://stackoverflow.com/questions/32620394
复制相似问题