[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”将使命令每两小时运行一次。
考虑到这一点,如果你想每 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