systemd timer 定时任务教程:从单元文件到可靠运维
使用 service 与 timer 单元构建可审计的 Linux 定时任务,讲清 OnCalendar、Persistent、随机延后、启停检查和失败排查。

systemd timer 定时任务教程:把脚本变成可管理服务
这篇 systemd timer 定时任务教程展示如何把一次性脚本拆成 service 与 timer 两个单元。相比把所有信息塞进一行计划表达式,systemd 可以统一管理运行身份、依赖关系、日志、资源限制和失败状态。下面以每日执行备份脚本为例,所有命令都应先在非生产环境验证,并按你的目录和权限调整。开始前可参考站内的Linux 安全基线,确保脚本、凭据与输出目录只有必要账号可访问。
准备脚本与 service 单元
先把任务脚本放在固定路径,例如 /usr/local/sbin/site-backup.sh,由 root 所有且不可被普通用户修改。脚本要设置明确的退出码,对输入参数进行检查,并把临时文件写入受控目录。不要在单元文件中直接写入访问密钥;应使用权限受限的环境文件或专用凭据机制。
创建 /etc/systemd/system/site-backup.service:
[Unit]
Description=Create site backup archive
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=backup
Group=backup
ExecStart=/usr/local/sbin/site-backup.sh
PrivateTmp=true
NoNewPrivileges=true
Type=oneshot 适合执行完成后退出的任务。User 与 Group 用于限制权限,PrivateTmp 提供隔离的临时目录,NoNewPrivileges 防止进程获得新的特权。先执行 systemctl daemon-reload,再手动运行 systemctl start site-backup.service。只有手动执行成功后,才继续配置计时器。使用 systemctl status site-backup.service 和 journalctl -u site-backup.service 查看状态与日志。
创建 timer 单元
创建 /etc/systemd/system/site-backup.timer:
[Unit]
Description=Run site backup every day
[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=10m
Unit=site-backup.service
[Install]
WantedBy=timers.target
OnCalendar 使用 systemd 的日历事件语法。示例表示每天在系统本地时间的指定时刻触发。Persistent=true 会记录上次触发信息;如果机器在计划时刻关闭,重新启动后会补充一次错过的任务。RandomizedDelaySec 在基准时间后加入随机延后,适合避免许多服务器同时请求同一存储或接口。对于必须精确开始的任务,应根据业务目标决定是否移除随机延后。
启用并立即启动计时器:
systemctl daemon-reload
systemctl enable --now site-backup.timer
systemctl list-timers --all
list-timers 会显示下一次与上一次触发信息。还可以用 systemd-analyze calendar '*-*-* 03:15:00' 检查表达式未来的触发时刻,避免星期、时区或日期范围写错。修改单元后要重新加载配置,并重启对应 timer。
选择 OnCalendar 还是单调计时器
日历计时器适合“每天凌晨”或“每周一”这类墙上时钟语义。OnBootSec、OnActiveSec 和 OnUnitActiveSec 属于单调计时器,更适合“启动后若干时间”或“上次运行后间隔一段时间”的任务。单调时间通常不会因系统时钟校正而出现意外跳转,但不同指令的起算点并不相同,配置前应查阅官方 timer 手册。
如果任务执行时间可能超过触发间隔,service 是否仍处于活动状态会影响下一次启动。耗时任务应加入锁、幂等处理或队列,防止多个进程同时操作相同数据。需要自动恢复常驻进程时,应采用服务重启策略而非 timer,相关区别可查看站内的systemd 服务自动重启教程。
验证、排错与上线清单
上线前至少验证四件事:手动启动 service 成功;timer 的下一次触发符合预期;任务账号能够读写必要目录;失败时日志和告警能够被发现。常见排查顺序是查看 systemctl status,再查看对应单元日志,然后确认脚本退出码、文件权限、工作目录和环境变量。systemd 默认不会读取交互式 shell 的完整环境,因此脚本应使用绝对路径。
停用任务时执行 systemctl disable --now site-backup.timer,这会停止并取消开机启用计时器,但不会删除单元文件。删除前先确认没有依赖关系,再移除文件并重新加载配置。通过 service 承担执行、timer 承担触发、日志承担审计,定时任务就能成为可检查、可回滚的运维组件。


