Linux 定时任务:cron 与 crontab 全面指南
更新: 8/29/2026字数: 0 字 时长: 0 分钟

在 Linux 系统管理与后端开发中,定时任务(Cron) 是实现自动化运维的核心机制。无论是定期备份数据库、清理日志文件、拉取定时数据,还是发送系统通知,都离不开它。
1. 什么是 cron 与 crontab?
crond:Linux 系统后台运行的守护进程(Daemon),每分钟检查一次是否有需要执行的定时任务。crontab:全称 "cron table",即定时任务列表文件。我们通过crontab命令来管理当前用户的定时任务。
2. crontab 核心管理命令
用户级的定时任务配置保存在 /var/spool/cron/crontab/$USER 中。切忌直接用文本编辑器修改此文件,必须使用 crontab 命令操作:
| 命令 | 作用 | 说明 |
|---|---|---|
crontab -e | 编辑当前用户的定时任务 | 初次使用会提示选择编辑器(如 nano 或 vim) |
crontab -l | 列出当前用户的所有定时任务 | 查看配置清单 |
crontab -r | 清空当前用户的所有定时任务 | ⚠️ 高危操作!建议先 crontab -l 备份 |
sudo crontab -u username -e | 编辑指定用户的定时任务 | 仅 root 管理员权限可用 |
3. crontab 语法规则(5 颗星表达式)
在 crontab -e 打开的文件中,每一行代表一条定时任务。标准格式如下:
text
* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └─── 星期几 (Day of week: 0 - 6, 0代表周日)
│ │ │ └─────── 月份 (Month: 1 - 12)
│ │ └─────────── 日期 (Day of month: 1 - 31)
│ └─────────────── 小时 (Hour: 0 - 23)
└─────────────────── 分钟 (Minute: 0 - 59)常用特殊符号
| 符号 | 含义 | 示例与解读 |
|---|---|---|
* | 匹配任意值 | * 在分钟位置 = 每分钟 |
, | 列出多个值(逗号分隔) | 1,15,30 在分钟位置 = 第 1、15、30 分钟时 |
- | 范围区间 | 1-5 在星期位置 = 周一到周五 |
/* | 间隔频率(步长) | */15 在分钟位置 = 每隔 15 分钟 |
4. 高频实用案例解析
| 场景需求 | Cron 表达式格式 |
|---|---|
| 每分钟执行一次 | * * * * * /path/to/script.sh |
| 每隔 5 分钟执行一次 | */5 * * * * /path/to/script.sh |
| 每天凌晨 2:30 执行 | 30 2 * * * /path/to/script.sh |
| 每周一早上 8:00 执行 | 0 8 * * 1 /path/to/script.sh |
| 每个月 1 号凌晨 0:00 执行 | 0 0 1 * * /path/to/script.sh |
| 工作日(周一至周五)每小时整点执行 | 0 * * * 1-5 /path/to/script.sh |
5. 生产环境坑点与最佳实践
在使用 cron 时,绝大多数“任务没有如期执行”的问题都来自于以下几点:
坑点 1:缺少环境变量导致命令未找到
crond 执行任务时的环境变量(如 PATH)非常干净,通常只包含 /usr/bin:/bin。如果脚本依赖了 /usr/local/bin 或 Node.js/Python 虚拟环境,会因为找不到命令而失败。
解法:在脚本内部或 crontab 顶部显示指定环境变量,或在配置中使用命令的绝对路径。
坑点 2:输出未定向导致垃圾邮件或静默失败
cron 会默认将任务的标准输出(stdout)和错误输出(stderr)尝试通过邮件发送给本地用户。如果不处理,可能会挤满 /var/mail。
解法:务必重定向输出到日志文件,或直接丢弃:
bash
# 1. 将标准输出与错误输出重定向到自定义日志文件(推荐)
30 2 * * * /home/alex/scripts/backup.sh >> /home/alex/logs/backup.log 2>&1
# 2. 如果不需要日志,直接扔进黑洞 /dev/null
0 3 * * * /home/alex/scripts/clean.sh > /dev/null 2>&16. 实操案例:配置一个自动日志备份任务
实操步骤
bash
# 1. 打开定时任务编辑器
crontab -e
# 2. 在文件末尾添加以下两行:
# 设置环境变量,防止路径找不到
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 每天凌晨 3:00 执行日志清理脚本,并将输出记录到 clean.log
0 3 * * * /bin/bash /home/alex/scripts/clean_logs.sh >> /home/alex/logs/clean.log 2>&1
# 3. 保存并退出,终端会提示:crontab: installing new crontab
# 4. 确认任务已生效
crontab -l7. 总结
- 基本格式记准:分、时、日、月、周 5 个字段。
- 绝对路径最保险:在 crontab 中执行的脚本和内部调用的命令,尽量写绝对路径(如
/bin/bash、/usr/bin/python3)。 - 做好日志重定向:始终使用
>> log.txt 2>&1记录输出,方便排查失败原因。