用 systemd timer 替代 cron:可观测、可依赖、可延迟

举报
yd_257918670 发表于 2026/10/25 06:12:47 2026/10/25
【摘要】 用 systemd timer 替代 cron:可观测、可依赖、可延迟很多人默认用 cron 做定时任务。在现代 Linux(尤其是 Ubuntu 24.04)上,systemd timer 往往更合适:失败有日志、可声明依赖、错过窗口还能补跑,排障也更直观。 为什么考虑 timercron 的痛点常见有三类:静默失败:脚本挂了,邮箱没配好就什么都看不到。环境不一致:PATH、工作目录、环...

用 systemd timer 替代 cron:可观测、可依赖、可延迟

很多人默认用 cron 做定时任务。在现代 Linux(尤其是 Ubuntu 24.04)上,systemd timer 往往更合适:失败有日志、可声明依赖、错过窗口还能补跑,排障也更直观。

为什么考虑 timer

cron 的痛点常见有三类:

  1. 静默失败:脚本挂了,邮箱没配好就什么都看不到。
  2. 环境不一致:PATH、工作目录、环境变量和手动跑不一样。
  3. 错过就丢:机器关机或服务未启动时,该点的任务直接跳过。

systemd 把「做什么」和「何时做」拆开:.service 描述动作,.timer 描述时间。journalctl -u your.service 能直接看到每次执行的 stdout/stderr 和退出码。

最小可运行示例

假设要每天 6:00(本机时区)跑一次备份脚本 /usr/local/bin/backup.sh。

/etc/systemd/system/backup.service:

[Unit]
Description=Daily backup
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup.sh
Nice=10

/etc/systemd/system/backup.timer:

[Unit]
Description=Run backup daily at 06:00

[Timer]
OnCalendar=*-*-* 06:00:00
Persistent=true
RandomizedDelaySec=5m

[Install]
WantedBy=timers.target

然后:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
journalctl -u backup.service -n 50 --no-pager

要点:

  • Persistent=true:宕机错过窗口后,开机可补跑一次(不是把所有错过的都补上)。
  • RandomizedDelaySec:多台机器别卡在同一秒,减轻共享存储或上游压力。
  • Type=oneshot:适合跑完就结束的脚本;长驻进程用 simple/notify。

日历表达式速查

需求 OnCalendar 示例
每天 6 点 *-*-* 06:00:00
工作日 9 点 Mon..Fri 09:00:00
每小时整点 hourly
每周一 8:30 Mon *-*-* 08:30:00

不确定解析结果时:

systemd-analyze calendar 'Mon..Fri 09:00:00'

和 cron 怎么选

  • 继续用 cron:极简单的一行命令、用户级 crontab、临时一次性提醒。
  • 改用 timer:要可靠日志、依赖网络/挂载、补跑、限流(CPUQuota/MemoryMax)、或和其它 unit 联动。

把定时逻辑迁到 systemd 后,运维习惯会变成:改 service/timer → daemon-reload → restart timer → 用 list-timers 和 journalctl 验收。比翻 /var/log/syslog 里 cron 的一行摘要省心得多。

若你还在用「脚本里自己 sleep 循环」冒充定时,优先换成 timer;进程崩溃或重启后,systemd 会按 unit 定义重新拉起调度,而不是靠你手动再起一个后台循环。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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