用 systemd timer 替换 cron:让定时任务有日志、有状态、可追溯

举报
yd_284028467 发表于 2026/11/04 10:04:10 2026/11/04
【摘要】 cron 配置简单但缺乏日志和依赖管理;systemd timer 用 .service + .timer 单元解决这两点:日志进 journalctl,触发条件灵活,还支持依赖和补跑。本文给出最小迁移配置与实测注意点。

一、为什么想换掉 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 跑生产任务,值得花半小时迁移一套试试。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。