使用systemd创建定时任务
在 Linux 中,使用 systemd 创建定时任务(即替代传统的 crontab)主要是通过两个单元(unit)文件来实现:
- Service 单元(.service):定义要执行的任务内容
- Timer 单元(.timer):定义何时执行该任务
与 cron 相比,优点如下:
精确到秒
灵活的时间表达,同时支持多个表达式
OnCalendar=支持复杂的时间表达式,如:日志记录集成
自动集成到 journalctl,方便追踪
失败重试机制
可通过 Restart= 配置失败重试
错过进可以补跑
Persistent=true可实现启动/停止控制
可随时通过 start/stop 启动/停止服务
.service 和 .timer 文件名是否必须要一致:
不必须完全一致,但强烈建议保持一致。
虽然 systemd 不强制 .timer和.service文件名称相同,但如果名称一致,系统会自动知道.timer对应的是哪个.service
如果文件名不一致时,怎么办:
可以通过Unit=显式指定.service的名称,如:
[Unit] Description=Custom timer
[Timer] OnCalendar=*:0/5 Unit=backup.service # 指定目标任务为 backup.service
[Install] WantedBy=timers.target
创建 service 文件
路径通常为
/etc/systemd/system/文件名格式为 xxx.service创建
/etc/systemd/system/backup.service创建 timer 文件
创建
/etc/systemd/system/backup.timerOnCalendar 时间格式
格式:DayOfWeek Year-Month-Day Hour:Minute:Second
字段解释:
Year:年份 Month:月份 Day:日期
Hour:小时
Minute:分钟
Second:秒,默认0秒,可以省略
*:匹配任意
*/n:每 n 个单位触发
1,2,3:多个具体的值
..:范围,如1..5
还可以写成 Mon,Tue 这样指定星期几
常用示例:
每天 02:00 OnCalendar=--* 02:00:00
每小时 OnCalendar=hourly
每分钟 OnCalendar=minutely
每5分钟 OnCalendar=*:0/5
每周一 08:00 OnCalendar=Mon --* 08:00:00
每月1日 00:00 OnCalendar=--01 00:00:00
每年1月1日 00:00 OnCalendar=*-01-01 00:00:00
启动和测试
查看日志
1journalctl -u backup.service