Skip to content
 

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>&1

6. 实操案例:配置一个自动日志备份任务 ​

实操步骤

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 -l

7. 总结 ​

  1. 基本格式记准:分、时、日、月、周 5 个字段。
  2. 绝对路径最保险:在 crontab 中执行的脚本和内部调用的命令,尽量写绝对路径(如 /bin/bash、/usr/bin/python3)。
  3. 做好日志重定向:始终使用 >> log.txt 2>&1 记录输出,方便排查失败原因。