Ubuntu 系统系列 | 第 12 天:计划任务与自动化——cron、systemd timer、at 命令详解

第 12/30 天


引言

在服务器运维和日常桌面管理中,很多任务需要定时执行——凌晨备份数据库、每小时清理日志、每周更新系统缓存。手动操作显然不现实,这时候就需要计划任务工具出场。

Ubuntu 系统提供了三套主流的自动化方案:

  • cron — 经典 Linux 定时任务,几乎所有发行版标配
  • systemd timer — 现代替代方案,与 systemd 生态深度集成
  • at — 一次性延时任务,适合”今晚 11 点关机”这类场景

今天我们就逐一拆解它们的用法、适用场景和实战技巧。


一、核心概念

1.1 cron 体系

cron 由 crond 守护进程驱动,通过读取 crontab 文件来决定何时执行什么命令。每个用户有自己的 crontab,系统级任务放在 /etc/crontab/etc/cron.d/ 目录下。

cron 表达式是精髓所在,分时日月周五个字段组成:

* * * * * command
─ ─ ─ ─ ─
│ │ │ │ │
│ │ │ │ └── 星期 (0-7, 0和7都表示周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日 (1-31)
│ └──────── 时 (0-23)
└────────── 分 (0-59)

1.2 systemd timer

systemd timer 是 systemd 生态下的定时器,每个 timer 单元关联一个对应的 service 单元。相比 cron,它的优势在于:

  • 日志系统完善 — 通过 journalctl 统一查看
  • 依赖管理 — 可以设置在某服务启动后才执行
  • 日历时间表达式 — 更接近自然语言,如 Mon..Fri 09:00:00
  • 精确控制 — 支持随机延迟、单调时间等高级特性

1.3 at 命令

at 是”一次性计划任务”的专用工具,适合执行一次就不再需要的任务。安装 at 包后,用 at 22:00 进入交互模式,或通过管道传递命令。


二、实战步骤

2.1 cron 基础操作

查看当前用户的 crontab:

$ crontab -l
no crontab for root

编辑 crontab:

$ crontab -e

第一次运行会提示选择编辑器,选 nano 或 vim 均可。

实战:每天凌晨 3 点备份数据库

# 在 crontab 中添加以下行(crontab -e 编辑)
0 3 * * * /usr/bin/mysqldump -u root mydb > /var/backups/mydb_$(date +%Y%m%d).sql 2>&1

注意:crontab 中 % 需要转义为 %,否则会被解释为换行符。

系统级 crontab 示例(/etc/crontab):

# 格式多了一个「用户」字段
0  */2  *  *  *  root  /usr/local/bin/cleanup-logs.sh

2.2 systemd timer 实战

第一步:创建 service 单元

$ cat /etc/systemd/system/backup-db.service
[Unit]
Description=Database backup service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-db.sh

第二步:创建对应的 timer 单元

$ cat /etc/systemd/system/backup-db.timer
[Unit]
Description=Run database backup daily at 3am

[Timer]
OnCalendar=daily
# 精确时间:OnCalendar=*-*-* 03:00:00
# 随机延迟,避免多任务同时执行
RandomizedDelaySec=300

[Install]
WantedBy=timers.target

第三步:启用并启动 timer

$ sudo systemctl daemon-reload
$ sudo systemctl enable backup-db.timer
$ sudo systemctl start backup-db.timer

查看所有活跃的 timer:

$ systemctl list-timers --all
NEXT                        LEFT          LAST                        PASSED    UNIT
Mon 2026-07-22 03:00:00 CST 7h left       Mon 2026-07-21 03:00:00 CST 16h ago   backup-db.timer

1 timers listed.

2.3 at 命令实战

检查 at 是否安装:

$ dpkg -l | grep at
ii  at    3.2.5    amd64    Delayed job execution and batch processing

未安装则执行 sudo apt install at -y

安排一次性任务:今晚 11 点关机

$ echo "sudo shutdown -h now" | at 23:00
warning: commands will be executed using /bin/sh
job 5 at Mon Jul 21 23:00:00 2026

查看待执行的任务队列:

$ atq
5      Mon Jul 21 23:00:00 2026 a root

取消任务:

$ atrm 5

2.4 高级 cron 技巧

使用特殊字符串简化常用时间:

@reboot       # 系统启动时运行
@daily        # 每天 0:00  (等价于 0 0 * * *)
@hourly       # 每小时 0 分
@weekly       # 每周日 0:00
@monthly      # 每月 1 日 0:00

示例:系统启动时发送 IP 通知

@reboot /usr/local/bin/notify-ip.sh

设置 cron 日志:

Ubuntu 默认不记录 cron 执行日志,要启用需修改 /etc/rsyslog.d/50-default.conf

# 取消注释以下行
cron.*                          /var/log/cron.log

# 重启 rsyslog
$ sudo systemctl restart rsyslog

查看日志:

$ grep CRON /var/log/syslog | tail -5
Jul 21 03:00:01 ubuntu CRON[12345]: (root) CMD (/usr/local/bin/backup-db.sh)
Jul 21 03:00:01 ubuntu CRON[12346]: (root) CMD (mysqldump -u root mydb > /var/backups/mydb_20260721.sql)

2.5 systemd timer 高级用法

OnCalendar 表达式示例:

# 每周一至周五 9:00
OnCalendar=Mon..Fri 09:00:00

# 每月 1 日和 15 日 0:00
OnCalendar=*-*-01,15 00:00:00

# 每 15 分钟
OnCalendar=*:0/15

单调时间定时器(相对时间):

[Timer]
# 系统启动后 5 分钟执行
OnBootSec=5min
# 上次执行后 1 小时再次执行
OnUnitActiveSec=1h

三、常见问题

Q1: cron 任务没有执行?

最常见的排查步骤:

  1. 确认 crond 在运行:systemctl status cron
  2. 检查 cron 日志:grep CRON /var/log/syslog
  3. 确认命令的绝对路径,cron 环境变量很少
  4. 检查脚本权限:chmod +x /path/to/script.sh
  5. 注意 cron 的 PATH 极小,建议在脚本顶部设置 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Q2: systemd timer 和 cron 如何选择?

对比项 cron systemd timer
学习成本
日志管理 需额外配置 原生 journalctl
依赖控制 支持
随机延迟 需 crontab 技巧 原生支持
跨平台 几乎一切 Linux 仅 systemd 系

建议:简单任务用 cron,需要精细控制、依赖管理和日志审计的场景用 systemd timer。

Q3: at 任务没执行?

  • 确认 atd 服务运行:systemctl status atd
  • 检查 at 队列:atq
  • 查看执行结果:/var/spool/mail/rootjournalctl -u atd

四、总结

工具 适用场景 频率 安装方式
cron 周期性定时任务 永久重复 系统自带
systemd timer 复杂调度 + 依赖管理 永久重复 系统自带
at 一次性延时任务 单次 sudo apt install at

掌握这三板斧,你就能让 Ubuntu 系统在无人值守的情况下自动完成绝大多数运维工作,是迈向”自动化运维”的第一步。


下期预告

第 13 天:系统监控与性能分析——top、htop、iotop、nmon 等工具实战

下期我们将深入 Ubuntu 系统监控工具箱,从经典的 top 到现代的 htop,再到磁盘 I/O 专用的 iotop,以及全方位的 nmon 报告,教你如何快速定位系统瓶颈。


系列目录

天数 标题 状态
第 1 天 Ubuntu 起源与发行版哲学 ✅ 已发布
第 2 天 安装方式全指南 ✅ 已发布
第 3 天 桌面环境深入解析 ✅ 已发布
第 4 天 文件系统与目录结构 ✅ 已发布
第 5 天 包管理:apt、snap、flatpak ✅ 已发布
第 6 天 用户与权限管理 ✅ 已发布
第 7 天 进程管理基础 ✅ 已发布
第 8 天 网络配置与诊断 ✅ 已发布
第 9 天 存储管理与磁盘操作 ✅ 已发布
第 10 天 系统服务与 systemd 详解 ✅ 已发布
第 11 天 日志系统与 journalctl ✅ 已发布
第 12 天 计划任务与自动化 📝 今日发布
第 13 天 系统监控与性能分析 ⏳ 待发布
第 14 天 防火墙与网络安全 ⏳ 待发布
第 15 天 SSH 远程管理与安全加固 ⏳ 待发布
第 16 天 Web 服务器搭建(Nginx/Apache) ⏳ 待发布
第 17 天 数据库部署与管理 ⏳ 待发布
第 18 天 Docker 容器化入门 ⏳ 待发布
第 19 天 LAMP/LEMP 环境搭建 ⏳ 待发布
第 20 天 备份策略与数据恢复 ⏳ 待发布
第 21 天 文件共享(Samba/NFS) ⏳ 待发布
第 22 天 Shell 脚本编程基础 ⏳ 待发布
第 23 天 系统安全加固实战 ⏳ 待发布
第 24 天 内核参数调优 ⏳ 待发布
第 25 天 虚拟化技术(KVM/QEMU) ⏳ 待发布
第 26 天 容器编排(Docker Compose) ⏳ 待发布
第 27 天 CI/CD 流水线基础 ⏳ 待发布
第 28 天 高可用与负载均衡 ⏳ 待发布
第 29 天 故障排查方法论 ⏳ 待发布
第 30 天 从入门到精通:回顾与进阶路线 ⏳ 待发布

本文为 Ubuntu 系统系列第 12 篇,完整 30 天系列持续更新中,欢迎关注!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容