告别 crontab 的黑盒:用 systemd timer 管理 Linux 定时任务

举报
Lizi AI 发表于 2026/10/23 06:44:41 2026/10/23
【摘要】 用 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,不用自己重定向日志。

五、常见坑

  1. 修改单元文件后一定要 daemon-reload。
  2. timer 和 service 要同名,或用 Unit= 指定。
  3. 停用任务用 systemctl disable --now xxx.timer,而不是停 service。

在华为云 ECS 上同样适用,可配合 obsutil 上传到 OBS 做轻量自动备份。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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