Unix “如何使用Cron”;步骤;工作
我遇到了这样一种情况:我以为每55分钟运行一次的cron作业实际上是在小时后55分钟运行的,而是在小时的顶端运行的。实际上,这不是一个cron作业,而是一个使用cron语法的作业 当我要求这个应用程序每55分钟安排一次作业时,它会创建一个crontab行,如下所示Unix “如何使用Cron”;步骤;工作,unix,cron,Unix,Cron,我遇到了这样一种情况:我以为每55分钟运行一次的cron作业实际上是在小时后55分钟运行的,而是在小时的顶端运行的。实际上,这不是一个cron作业,而是一个使用cron语法的作业 当我要求这个应用程序每55分钟安排一次作业时,它会创建一个crontab行,如下所示 */55 * * * * 此crontab行以结束,而不是每55分钟运行一次作业。相反,作业在工作时间后55分钟运行,并在工作时间的最高峰运行。我不希望这样。我已经运行了一个,它验证了不希望出现的行为是正确的cron行为 这导致我查
*/55 * * * *
此crontab行以结束,而不是每55分钟运行一次作业。相反,作业在工作时间后55分钟运行,并在工作时间的最高峰运行。我不希望这样。我已经运行了一个,它验证了不希望出现的行为是正确的cron行为
这导致我查找/
的实际含义。当我看这本书时,我了解到斜线表示“步骤”,但手册本身在这方面有点模糊
阶跃值可与范围一起使用。在带有“
”的范围之后,指定数字值在该范围内的跳过。例如,“0-23/2
”可在“小时”字段中用于指定每隔一小时执行一次命令(V7标准中的备选方案是“0,2,4,6,8,10,12,14,16,18,20,22”
)。在星号后面还允许执行步骤,因此如果您想说“每两小时”,只需使用“*/2
”
手册的描述(“指定数字值在整个范围内的跳跃”)有点模糊,“每两小时”的示例有点误导(这可能是导致应用程序中出现错误的原因)
因此,有两个问题:
”指定数字值在整个范围内的跳过。对于
例如,“0-23/2
”可在小时字段中用于指定命令
每隔一小时执行一次(V7标准中的替代方案为
“0,2,4,6,8,10,12,14,16,18,20,22
”)。也允许在测试后执行步骤
星号,所以如果你想说“每两小时”,只需使用“*/2
”
这里所指的“范围”是在/
之前给出的范围,它是特定字段的时间范围的子范围。第一个字段指定一小时内的分钟数,因此*/…
指定从0到59的范围。*/55
的第一个字段指定了55倍的所有分钟数(在0-55范围内),即每小时后0分钟和55分钟
类似地,第二个(小时)字段中的0-23/2
或*/2
指定了2的倍数的所有小时(在0-23范围内)
如果指定的范围不是从0
开始,则/
后面的数字(例如N)指定从范围下限开始的每N分钟/小时/etc一次。例如,第二个字段中的3-23/7
表示从03:00(03:00、10:00、17:00)开始每7小时一次
当您想要的时间间隔恰好平均划分为下一个更高的时间单位时,这种方法效果最佳。例如,您可以轻松地指定每1、2、3、4、5、6、10、12、15、20或30分钟发生一次事件,或每1、2、3、4、6或12小时发生一次事件。(感谢巴比伦人选择了有这么多好除数的时间单位。)
不幸的是,cron没有在超过一小时的时间范围内“每55分钟”的概念
如果你想每55分钟运行一次作业(比如,在00:00、00:55、01:50、02:45等),你必须间接地执行。一种方法是安排脚本每5分钟运行一次;然后脚本检查当前时间,并且每调用11次只执行一次
或者,您可以在crontab文件中使用多行在00:00、00:55、01:50等时间运行同一个作业,但一天不是55分钟的倍数。如果您不介意一天、一周或一个月有一次更长或更短的间隔,您可以编写一个程序来生成一个包含所需条目的大型crontab,所有条目都在指定时间运行相同的命令。应该考虑另一个名为
at
的工具。可以使用它代替cron来实现主题初学者想要的内容。据我记忆所及,它是预装在OSX中的,但并没有与Debian等Linux发行版捆绑在一起(只需apt install at
)
它在一天中的特定时间运行作业,可以使用复杂的规范计算该时间。在我们的案例中,可以使用以下内容:
您还可以给出时间,如now+count time units,其中时间单位可以是分钟、小时、天或周,您可以
可以告诉at,用今天的时间来安排今天的工作,用明天的时间来安排明天的工作
脚本每2分钟执行一次。sh
每2分钟执行一次。每次实例运行时,它都会延迟下一次执行:
#!/bin/sh
at -f ./every2min.sh now + 2 minutes
echo "$(date +'%F %T') running..." >> /tmp/every2min.log
哪个输出
2019-06-27 14:14:23 running...
2019-06-27 14:16:00 running...
2019-06-27 14:18:00 running...
由于at的不知道“秒”单位,执行时间将在第一次运行后四舍五入到整分钟。但是对于一个给定的任务(55分钟范围),这应该不是一个大问题
还可能有安全方面的考虑
对于at和batch,从标准输入或使用-f选项指定的文件读取命令并执行。工作目录、环境(变量BASH_VERSINFO、DISPLAY、EUID、GROUPS、SHELLOPTS、TERM、UID和u除外)和umask从调用时就保留了下来
这是我见过的最简单的安排每X分钟运行一次的方法