[Linux] 让我迷上 CRON 时间格式和执行间隔的要点

你好。

我叫宫崎,来自系统解决方案部门,最近获得了AWS和GCP认证。
我的LPIC目标是202分,但现在我只有0分。

这次我想写一下我在设置 CRON 时间格式和执行间隔时遇到的问题。

CRON 时间格式

首先,CRON 可以指定的日期和时间如下所示。
参考: CRONTAB 手册页

场地 可能的值
分钟 0-59
时间 0-23
本月最后一天 1-31
1-12
星期几 0-7

基于此,下面提供一个配置示例。

# 执行 db_backup.sh 脚本,时间为 04:00 0 4 * * * /home/centos/db_backup.sh
# 每 30 分钟执行一次 rsync */30 * * * * /home/centos/rsync.sh
# 每月15日计数 * * 15 * * /home/centos/count.sh
# 每周一删除文件 * * * 1 * /home/centos/delete.sh
# 每 1 分钟运行一次 * * * * * /home/centos/1hunoki.sh

看起来是这样的。
可能还有很多其他问题,但我这次遇到的问题是它每45分钟运行一次。

每隔 45 分钟执行一次

那么,如何设置一个每 45 分钟运行一次的 shell 脚本呢?
一开始,我是这样设置的,我觉得这样应该可行。

#每 45 分钟运行一次 */45 * * * * /home/centos/45hunoki.sh

是的,这是不正确的。

检查 cron 日志

[root@test-server ~]# cat /var/log/cron 9月21日 19:45:01 test-server CROND[3890]: (root) CMD (/home/centos/45hunoki.sh) 9月21日 20:00:01 test-server CROND[3894]: (root) CMD (/home/centos/45hunoki.sh) 9月21日 20:45:01 test-server CROND[3899]: (root) CMD (/home/centos/45hunoki.sh)

执行时间为00:45。为什么……

原因在于“*/45”中的“*/”并未包含0到24小时之间的所有分钟。
这种说法可能难以理解。
换句话说,它不包括00:59、01:00和01:01。

*/45 替换后变为 00-59/45。
因此,这意味着指定了 00 和 45。

顺便说一下,如果您指定 01-12/3,则
您指定的是 01、04、07 和 10。

*/9 的结果为 0, 9, 18, 27, ... 54, 0。
请注意,在 54 之后,结果返回 0。

CRON MAN 页面上有如下说明:

间隔值也可以用范围来指定。范围后面的“/”表示跳过该范围内的指定次数。例如,在小时字段中指定“0-23/2”将使命令每两小时运行一次。

CRONTAB 手册页

考虑到这一点,如果你想每 45 分钟运行一次,正确的做法如下:

*/45 */3 * * * $45hunoki.sh 30 1-22/3 * * * $45hunoki.sh 15 2-23/3 * * * $45hunoki.sh

如果设置为每 45 分钟执行一次,则可以创建以下模式:
・从午夜开始,每 3 小时在 00 和 45 分钟
执行・从 1:00 到 22:00,每 3 小时在 30 分钟执行
・从 2:00 到 23:00,每 3 小时在 15 分钟执行

分钟 00 15 30 45
0点钟 00:00 00:45
1点钟 1:30
两点钟 02:15
3点钟 03:00 03:45
4点钟 04:30
五点钟 05:15

当你制作表格时,无论是每 40 分钟还是每 50 分钟,你都可以看出其中的规律。

概括

*/45 我很惭愧,竟然觉得没问题。
再次观察这个人,我注意到了很多事情。
我建议你把它写下来,因为很容易就能发现其中的规律。

就是这样。

如果您觉得这篇文章有帮助,请点赞!
4
加载中...
4 票,平均:1.00 / 14
57,437
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

宫崎健太

我于 2017 年作为应届毕业生加入 Beyond。

我们为主要提供基于网络的服务的公司所使用的服务器和云提供24小时、365天的运营、维护和监控服务。
我属于系统解决方案部门,我的工作是改善 Beyond 的运营,以便我们的客户能够专注于他们的业务。

认证:AWS 认证解决方案架构师、GCP 专业云架构师、Linuc1