第 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 任务没有执行?
最常见的排查步骤:
- 确认 crond 在运行:
systemctl status cron - 检查 cron 日志:
grep CRON /var/log/syslog - 确认命令的绝对路径,cron 环境变量很少
- 检查脚本权限:
chmod +x /path/to/script.sh - 注意 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/root或journalctl -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 天系列持续更新中,欢迎关注!















暂无评论内容