systemd服务未被其关联timer单元按计划触发的故障咨询
systemd timer未按计划触发的常见原因
- timer单元未启动或未启用
仅执行systemctl daemon-reload不会自动激活timer单元,需执行sudo systemctl start myservice.timer手动启动,若要开机自动加载timer还需执行sudo systemctl enable myservice.timer。可执行systemctl list-timers --all查看timer的运行状态和下次触发时间。 - 时区不匹配
OnCalendar默认使用系统时区,若你配置的时间是本地时间但系统时区为UTC等其他时区,会导致触发时间和预期不符。可执行timedatectl查看系统时区,也可直接在规则中指定时区,例如OnCalendar=Asia/Shanghai *-*-* 10:33:00。 - 服务单元类型配置不合理
你给出的service配置未指定Type参数,默认值为simple,如果你的任务是单次执行的脚本,执行完成后进程退出,systemd会判定服务异常,或如果服务执行后处于active状态,timer默认不会重复触发已经激活的服务。针对定时执行的单次任务,建议在service的[Service]段添加配置:Type=oneshot RemainAfterExit=no - 配置时间已过无补触发规则
若你修改OnCalendar配置并重载daemon的时间晚于配置的触发时间(例如10:40才配置当天10:33的触发规则),且未开启Persistent=true参数,timer不会补执行已经错过的任务,需要等待下一个周期的触发时间。 - 配置语法或指向错误
可执行systemd-analyze verify myservice.timer检查timer单元的语法合法性,同时确认[Timer]段的Unit参数值和实际服务单元文件名完全一致(大小写、后缀均需匹配)。也可执行systemctl show myservice.timer | grep NextTriggerTime查看解析后的下次触发时间是否符合预期。 - 执行异常无日志
可分别查看timer和服务的日志排查问题:
确认是否有触发记录、执行报错等信息。# 查看timer日志 journalctl -u myservice.timer -f # 查看服务日志 journalctl -u myservice.service -f
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

