告别 crontab 的黑盒:用 systemd timer 管理 Linux 定时任务
【摘要】 用 systemd timer 替代 crontab 管理 Linux 定时任务,含 service/timer 单元写法与示例。
很多人写定时任务的第一反应是 crontab -e。它简单,但也有几个老毛病:任务失败了没日志、环境变量和交互式 shell 不一致、机器关机错过的任务不会补跑。现代 Linux 发行版都自带 systemd,它的 timer 单元正好能解决这些问题。本文用“每天备份目录”的例子,十分钟上手。
一、准备脚本
保存为 /usr/local/bin/backup-notes.sh:
#!/usr/bin/env bash
set -euo pipefail
SRC=/home/demo/notes
DST=/var/backups/notes
mkdir -p "$DST"
tar -czf "$DST/notes-$(date +%F).tar.gz" -C "$SRC" .
ls -1t "$DST"/notes-*.tar.gz | tail -n +8 | xargs -r rm -f
echo "backup done: $(date)"
执行 sudo chmod +x /usr/local/bin/backup-notes.sh
二、service 单元:定义“做什么”
/etc/systemd/system/backup-notes.service:
[Unit]
Description=Backup notes directory
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-notes.sh
User=root
验证:
sudo systemctl daemon-reload
sudo systemctl start backup-notes.service
systemctl status backup-notes.service
三、timer 单元:定义“什么时候做”
/etc/systemd/system/backup-notes.timer:
[Unit]
Description=Run backup-notes daily
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
OnCalendar 是触发时间;Persistent=true 表示关机错过会在开机后补跑;RandomizedDelaySec 随机延迟最多 5 分钟。启用:
sudo systemctl daemon-reload
sudo systemctl enable --now backup-notes.timer
四、查看计划和日志
systemctl list-timers --all
systemd-analyze calendar "Mon..Fri 09:00"
journalctl -u backup-notes.service --since today
任务输出自动进入 journal,不用自己重定向日志。
五、常见坑
- 修改单元文件后一定要 daemon-reload。
- timer 和 service 要同名,或用 Unit= 指定。
- 停用任务用 systemctl disable --now xxx.timer,而不是停 service。
在华为云 ECS 上同样适用,可配合 obsutil 上传到 OBS 做轻量自动备份。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)