在 linux 中配置 systemd 定时任务需成对创建同名 .service 和 .timer 文件,置于 /etc/systemd/system/ 下;.service 定义执行内容(type=oneshot、绝对路径 execstart、可设 user/environment),.timer 定义触发时机(oncalendar 或 onbootsec、unit= 指向服务、persistent=true 启用补执行、wantedby=timers.target);启用前须 daemon-reload,再 start timer,并用 list-timers、status 和 journalctl 验证状态与日志。

在 Linux 系统中配置 systemd 服务在特定时间定时触发,核心是成对创建 .service 和 .timer 文件,并正确关联、启用。它不依赖 cron 守护进程,而是由 systemd 原生调度,支持秒级精度、开机补执行、依赖网络就绪等能力。
写好一对同名单元文件
必须同时存在 xxx.service 和 xxx.timer,放在 /etc/systemd/system/ 下,名字完全一致(如 daily-cleanup.service + daily-cleanup.timer)。
-
.service 文件:定义“做什么”
用Type=oneshot(执行完即退出);ExecStart=必须写绝对路径命令或脚本;建议加User=指定非 root 用户,避免权限滥用;可加Environment=设置环境变量。 -
.timer 文件:定义“什么时候做”
在[Timer]节中设置OnCalendar=(日历时间)或OnBootSec=(启动后延迟);Unit=xxx.service明确指向对应服务;Persistent=true开启补执行(关机错过时,下次开机自动运行);[Install]节必须有WantedBy=timers.target,否则enable失败。
OnCalendar 时间写法要准确
OnCalendar 不支持 cron 风格的 */5 步进语法,只认完整时间点或预设关键词,空格是分隔符,不是冒号。
- 每天凌晨 2:30:
OnCalendar=*-*-* 02:30:00 - 每周一上午 9 点:
OnCalendar=Mon *-*-* 09:00:00或更简洁的Mon 09:00:00 - 用预设值最稳妥:
daily(等价于*-*-* 00:00:00)、hourly、weekly - 验证写法是否合法:
systemd-analyze calendar "Mon 09:00"会显示解析结果和下次触发时间
启用后必须检查三件事
配置完常出现“写了却没跑”,多数卡在这几步:
- 执行
sudo systemctl daemon-reload—— 否则 systemd 完全不读新文件 - 运行
sudo systemctl start xxx.timer——enable只设开机自启,不等于现在就启动 - 查 service 日志:
journalctl -u xxx.service -n 30 -f—— timer 触发失败或脚本报错,都藏在这里,不会静默忽略
确认定时器是否生效
用以下命令快速验证状态:
-
systemctl list-timers --all查看所有 timer 的下次触发时间与上次运行时间 -
systemctl status xxx.timer看当前是否 active、是否 loaded、是否有 warning -
systemctl is-active xxx.timer返回active表示正在运行中











