linux通过systemd的timer服务实现定时
背景:每天5个小时执行一次,crontab无法实现。
timer定时器,即使服务器意外重启了,也不会根据timer的执行记录继续循环。
| 第一天 | 23:00 ⬅️ 首次 |
|---|---|
| 第二天 | 04:00、09:00、14:00、19:00 |
| 第三天 | 00:00、05:00、10:00、15:00、20:00 |
| 第一天 | 01:00、06:00、11:00、16:00、21:00 |
| 第四天 | 02:00、07:00、12:00、17:00、22:00 |
| 第五天 | 03:00、08:00、13:00、18:00、23:00 |
| 第六天 | 04:00、09:00、14:00、19:00 |
| 第七天 | 00:00、05:00、10:00、15:00、20:00 |
注:我为方便管理,server文件名必须和timer文件名一致,否则
测试环境:
ubuntu24.04
1.创建server文件
2.创建timer文件
3.启动服务
4.查看管理服务
第一步,创建server服务文件¶
/etc/systemd/system/《同一自定义服务名》.service
1 2 3 4 5 6 7 8 9 10 | |
第二步,创建timer定时器文件¶
/etc/systemd/system/《同一义服务名》.timer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
第三步,启动服务¶
systemctl start my-task.timer用于启动定时器,会根据timer中的定义的时间启动脚本,而非立即启动脚本!!!
若想立即启动脚本,则执行systemctl start my-task.server
1 2 3 4 5 6 7 8 9 10 11 | |
第四步,查看管理¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
第五步,重置时间器¶
1 2 3 4 5 6 7 8 9 | |
其它:¶
systemd OnCalendar 铁律(必背)¶
只有当 OnCalendar 的时间是「未来时间」时,才会生效并更新下次执行时间。
三种情况的结果:¶
-
OnCalendar = 未来时间→ 生效!→ 下次执行时间 = 这个未来时间→ 覆盖原有周期
-
OnCalendar = 现在 / 过去时间→ 直接忽略!→ 不会触发执行→ 不会改变下次时间
-
已经执行过至少一次,且配置了 OnUnitActiveSec=5h→ OnCalendar 永久失效!→ 之后完全只按 5 小时间隔循环→ 你再怎么改 OnCalendar 到过去时间,都没用了