用 systemd timer 替代 cron:Linux 定时任务入门实践

举报
yd_263393080 发表于 2026/11/10 11:31:33 2026/11/10
【摘要】 本文用"每天备份目录"的小例子,演示如何用 systemd timer 完整替代 cron 管理 Linux 定时任务:从备份脚本、service 单元、timer 单元到启用验证与 journal 日志查看。覆盖 OnCalendar、Persistent 补跑、RandomizedDelaySec 错开执行、systemd-analyze 校验等关键参数,适合从 crontab 迁移的实践参考

很多人在 Linux 上做定时任务的第一反应是 crontab。cron 简单好用,但在需要查看日志、处理依赖、补跑错过的任务时就显得力不从心。现代发行版普遍使用 systemd,它自带的 timer 单元可以完整替代 cron,而且更好排查问题。本文用一个“每天备份目录”的小例子带你上手。

一、准备要执行的脚本
先写一个最简单的备份脚本 /usr/local/bin/backup.sh:

#!/bin/bash
tar -czf /var/backups/home-$(date +%F).tar.gz /home/demo

记得执行 chmod +x /usr/local/bin/backup.sh 赋予执行权限。

二、编写 service 单元
在 /etc/systemd/system/backup.service 中写入:

[Unit]
Description=Daily home backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Type=oneshot 表示这是一个执行完就退出的任务,正适合定时脚本。

三、编写 timer 单元
timer 文件名要和 service 同名,这里是 /etc/systemd/system/backup.timer:

[Unit]
Description=Run backup every day
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target

几个关键参数:OnCalendar 指定触发时间,格式比 cron 更易读;Persistent=true 表示如果机器在 2:30 时关机,开机后会补跑一次,这是 cron 做不到的;RandomizedDelaySec 可以在多台机器上错开执行,避免同时打满存储。

四、启用并验证

systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers backup.timer

list-timers 会显示下一次和上一次执行时间。想立刻测试一次,可以直接运行 systemctl start backup.service。

五、查看日志
这是 timer 相比 cron 最大的优势。所有输出都进入 journal:

journalctl -u backup.service --since today

脚本报错、退出码、执行耗时一目了然,不用再自己重定向输出到日志文件。

六、校验时间表达式
不确定 OnCalendar 写得对不对时,用 systemd-analyze calendar "*-*-* 02:30:00" 就能看到解析结果和下次触发时间,避免写错后白等一天。

小结
cron 适合快速写一行命令;而需要补跑、日志、资源控制的任务,systemd timer 是更稳妥的选择。从一个备份脚本开始,把手头的 crontab 逐步迁移过去,你会发现排查定时任务变得轻松很多。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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