Linux systemd 定时任务实战:用 timer 替代 crontab,每天自动备份一次数据

举报
yd_252022162 发表于 2026/11/11 06:13:43 2026/11/11
【摘要】 crontab 错过执行就跳过、没有统一日志?本文用每天凌晨自动备份数据的例子,手把手教你写 systemd service 与 timer:OnCalendar 定时、Persistent 补跑、journalctl 查日志,并避开三个新手常见坑。

很多新手一提到 Linux 定时任务,第一反应就是 crontab。crontab 确实简单,但它有两个短板:任务错过执行时间就直接跳过,也没有统一的日志和状态查看方式。systemd timer 正好补上这些短板:它和 service 单元配合,可以做到开机补跑、失败重试、日志集中查看。下面用一个每天凌晨备份数据的例子,把完整流程跑一遍。

一、一个定时任务由两个文件组成

systemd timer 本身不干活,它只负责“到点叫醒”对应的 service。先写备份脚本 /usr/local/bin/backup.sh:

#!/bin/bash
set -e
DATE=$(date +%Y%m%d)
tar -czf /backup/data-$DATE.tar.gz /data
find /backup -name 'data-*.tar.gz' -mtime +7 -delete

脚本只有三件事:打包当天数据、按日期命名、删除 7 天前的旧备份。写好后记得加可执行权限:chmod +x /usr/local/bin/backup.sh。

二、写 service 和 timer 文件

service 文件 /etc/systemd/system/backup.service 描述要做什么:

[Unit]
Description=每日数据备份
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

timer 文件 /etc/systemd/system/backup.timer 描述什么时候做:

[Unit]
Description=每天凌晨 2 点执行备份
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target

OnCalendar 的写法很直观,--* 02:00:00 就是每天 2 点。Persistent=true 是关键:服务器关机错过了 2 点,开机后会立刻补跑一次,而 crontab 遇到这种情况只会悄悄跳过。

三、启用并验证

systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers --all | grep backup

list-timers 能看到下一次触发时间,确认无误后可以先手动跑一次验证脚本:systemctl start backup.service,再用 systemctl status backup.service 和 journalctl -u backup.service 查看运行结果和日志,日志集中在这里,比翻 crontab 的邮件输出方便得多。

四、新手最容易踩的三个坑

第一,ExecStart 必须写绝对路径,timer 不会帮你找 PATH。第二,脚本里用到的命令也要写绝对路径,或者在脚本开头显式设置 PATH,否则手动能跑、定时跑就失败。第三,时区要先核对,timedatectl 看到的时间就是 timer 的时间,云服务器默认可能是 UTC,凌晨 2 点和你以为的 2 点可能差 8 小时。

结语

crontab 适合“跑一次就忘”的临时任务;需要补跑、需要查状态、需要看日志的长期任务,交给 systemd timer 更省心。先从每天备份这样的小任务开始,跑通一次,定时任务这块就入门了。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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