用 systemd timer 替换 cron:让定时任务有日志、有状态、可追溯
一、为什么想换掉 cron
cron 是 Linux 上最经典的定时任务工具,配置简单、几乎所有发行版都有。但它有两个长期痛点:一是执行情况没有标准日志,出问题只能翻 /var/log 或自己加重定向;二是任务之间没有依赖管理,表达不了"一个任务依赖另一个任务完成"这种关系。
systemd timer 把这两件事都解决了:每个任务对应一个 .service 单元和一个 .timer 单元,由 systemd 统一调度,运行日志直接进 journalctl,还能用 OnCalendar、OnUnitActiveSec 等灵活的触发条件。
二、最小的一套配置
以"每天凌晨 2 点清理 /tmp 下超过 7 天的文件"为例,需要两个文件:
# cleanup.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup_tmp.sh
# cleanup.timer
[Unit]
Description=Daily cleanup of /tmp
[Timer]
OnCalendar=daily 02:00
Persistent=true
[Install]
WantedBy=timers.target
之后执行 systemctl enable --now cleanup.timer 即可。Persistent=true 表示机器关机错过了触发时间,开机后会补跑一次。
三、几个实测中值得注意的点
1. 查看任务状态用 systemctl list-timers,所有 timer 的下一次触发时间一目了然;查某次运行日志用 journalctl -u cleanup.service。
2. 如果脚本执行时间较长,务必在 service 里设置 TimeoutStartSec,否则超时后 systemd 会杀掉进程,任务状态会变成 failed。
3. 脚本里尽量写绝对路径——timer 触发时的 PATH 很精简,/usr/local/bin 之外的命令可能找不到。
4. 排查"任务没跑"时,先看 timer 是否 enabled(systemctl is-enabled cleanup.timer),再看 journalctl -u cleanup.timer 的触发记录,绝大多数问题都能在这两行里定位。
四、小结
systemd timer 的学习成本很低——配置文件加起来不到 20 行,换来的是日志、状态、依赖和补跑能力。如果你的服务器上还在裸用 cron 跑生产任务,值得花半小时迁移一套试试。
- 点赞
- 收藏
- 关注作者
评论(0)