我希望每天有两个作业按照我指定的顺序连续运行。这个 crontab 能可靠地完成我想要的事情吗?
@daily job1
@daily job2
我假设它们一个接一个地运行,但我无法通过搜索 Web 或从以下任何联机帮助页中找到答案:cron(1)
、crontab(1)
、crontab(5)
。
@daily
如果 cron 并行或以不可预测的顺序运行安排的事情,上面的 crontab 显然不会做我想要的事情。
我知道我可以简单地制作一个 shell 脚本来按顺序启动它们,我只是好奇 cron 应该如何工作(而且我懒得收集测试数据或阅读源代码)。
Cron 由软件包提供cron
。操作系统是 Ubuntu 10.04 LTS(服务器)。
答案1
快速浏览一下源代码(在 Debian squeeze 中,我认为是相同的版本),它看起来确实像是给定文件中的条目,并且具有相同的时间按顺序执行。为此目的,@daily
和0 0 * * *
是相同的(实际上与此 cron 中@daily
的相同0 0 * * *
)。
我不会全面依赖这一点。有一天,有人可能会决定 cron 应该并行运行作业,以利用这些 32 核 CPU(其中 31 个核处于空闲状态)。这可以在实现 cron 源中遇到的这个 20 年前的待办事项时完成:
所有这些都应该被标记并限制负载;即,@hourly 的意思不是“0 * * * *”,而是“接近每个小时的前面,但直到系统负载较低”。 (…)(vix,90 年 1 月)
这里写起来非常容易@daily job1; job2
。如果作业按顺序执行很重要,请将其作为您所编写内容的直接结果。
此外,明确的顺序可以消除未来管理员认为这无关紧要的行重新排序的风险。
答案2
http://ss64.com/osx/crontab.html(以及其他参考文献)说@daily相当于
0 0 * * *
上面说要在午夜运行。我预计此类线路的两条线路都会尽可能接近午夜启动,但不能保证哪条线路先运行。我同意jw013在评论中的建议:
事实上,它的指定不足通常意味着它取决于实现,并且通常最好不要依赖这种行为。将一系列重要的作业放在自己的脚本中而不是作为单独的 crontab 条目可能会更干净、组织得更好。
答案3
@Giles 评论说在导入时使用单个脚本按顺序运行是合适的。
cron.daily
文件不指定运行时间。根据我的经验,它们确实是串行运行的。这是有道理的,因为许多后台作业可能在笔记本电脑或其他系统上运行
指定时间后,当前分钟安排的所有作业都会运行。使用不同的时间是个好主意。
如果您有互斥的作业,通常会使用锁定文件来确定另一个作业是否正在运行。