crontab 命令详解
文章目录
- [crontab 命令详解](#crontab 命令详解)
-
- [1. 什么是 crontab?](#1. 什么是 crontab?)
- [2. 基本命令语法](#2. 基本命令语法)
- [3. 常用选项](#3. 常用选项)
- [4. crontab 时间格式详解](#4. crontab 时间格式详解)
- [5. 特殊字符说明](#5. 特殊字符说明)
- [6. 预定义的时间宏](#6. 预定义的时间宏)
- [7. 实际示例](#7. 实际示例)
- [8. 环境变量和路径问题](#8. 环境变量和路径问题)
- [9. 输出处理](#9. 输出处理)
- [10. 用户管理](#10. 用户管理)
- [11. 系统级 crontab](#11. 系统级 crontab)
- [12. 权限控制](#12. 权限控制)
- [13. 调试技巧](#13. 调试技巧)
- [14. 最佳实践](#14. 最佳实践)
- [15. 完整示例配置](#15. 完整示例配置)
1. 什么是 crontab?
crontab 是 Linux/Unix 系统中用于设置周期性执行任务的命令。它允许用户在固定的时间间隔自动执行命令或脚本。
2. 基本命令语法
bash
crontab [选项] [文件]
系统架构图
用户级cron 系统级cron 匹配 不匹配 用户A crontab 用户B crontab 用户C crontab cron守护进程 /etc/crontab etc/cron.d etc/cron.hourly etc/cron.daily etc/cron.weekly etc/cron.monthly 用户编辑crontab crontab -e 保存到 /var/spool/cron/用户名 每分钟读取一次任务 检查任务时间 执行命令 等待下一分钟 记录日志 /var/log/cron
3. 常用选项
| 选项 | 说明 |
|---|---|
-l |
列出当前用户的定时任务 |
-e |
编辑当前用户的定时任务 |
-r |
删除当前用户的所有定时任务 |
-i |
与 -r 一起使用,删除前提示确认 |
-u <用户> |
指定操作用户(需要 root 权限) |
命令使用流程图
文件存储位置 /var/spool/cron/用户名 保存到用户cron文件 读取 /var/spool/cron/用户名 用户操作 crontab命令 crontab -e crontab -l crontab -r crontab -u 用户 编辑临时文件 语法检查 显示内容 删除用户所有任务 确认提示 -i 权限检查 需要root权限 执行指定用户操作
执行环境流程图
环境差异 与交互shell环境不同 执行命令 需要使用绝对路径 需要设置完整环境变量 cron守护进程 创建子进程 设置环境变量 SHELL=/bin/sh PATH=/usr/bin:/bin LOGNAME=用户名 HOME=用户目录 读取用户profile 输出处理 MAILTO 发送邮件 重定向到文件 丢弃输出 /dev/null
4. crontab 时间格式详解
text
* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └── 星期几 (0-7, 0和7都代表周日)
│ │ │ └─────── 月份 (1-12)
│ │ └──────────── 日期 (1-31)
│ └───────────────── 小时 (0-23)
└────────────────────── 分钟 (0-59)
时间字段说明
分钟:0-59
*/5= 每5分钟0,15,30,45= 每小时的第0,15,30,45分钟
小时:0-23
*/2= 每2小时9-17= 9点到17点之间
日期:1-31
*/10= 每10天1,15= 每月1号和15号
月份:1-12
*/3= 每3个月1,4,7,10= 1月,4月,7月,10月
星期几:0-7(0和7都是周日)
1-5= 周一到周五6,0= 周六和周日
时间表达式示例图
crontab 时间表达式 * * * * * 每分钟执行 0 * * * * 每小时整点执行 0 2 * * * 每天凌晨2点执行 0 0 * * 0 每周日执行 0 0 1 * * 每月1号执行 */15 * * * * 每15分钟执行 0 9-17 * * 1-5 工作日9-17点每小时执行 0 4,16 * * * 每天4点和16点执行
5. 特殊字符说明
| 字符 | 说明 | 示例 |
|---|---|---|
* |
所有可能的值 | * * * * * = 每分钟 |
, |
指定多个值 | 0,15,30,45 * * * * = 每15分钟 |
- |
指定范围 | 0 9-17 * * * = 9点到17点整点 |
/ |
指定间隔 | */10 * * * * = 每10分钟 |
@ |
预定义的时间 | @daily = 每天一次 |
6. 预定义的时间宏
bash
@reboot # 系统启动时执行
@yearly # 每年一次 (0 0 1 1 *)
@annually # 同 @yearly
@monthly # 每月一次 (0 0 1 * *)
@weekly # 每周一次 (0 0 * * 0)
@daily # 每天一次 (0 0 * * *)
@hourly # 每小时一次 (0 * * * *)
@midnight # 同 @daily
7. 实际示例
基础示例
bash
# 每天凌晨2点执行备份
0 2 * * * /home/user/backup.sh
# 每5分钟检查服务状态
*/5 * * * * /home/user/check_service.sh
# 每周一早上6点清理日志
0 6 * * 1 /home/user/clean_logs.sh
# 每月1号中午12点发送报告
0 12 1 * * /home/user/send_report.sh
# 工作日早上9点到下午6点,每小时执行
0 9-18 * * 1-5 /home/user/hourly_task.sh
复杂示例
bash
# 每季度第一天凌晨3点执行
0 3 1 1,4,7,10 * /home/user/quarterly_task.sh
# 每30分钟在工作时间执行
*/30 9-17 * * 1-5 /home/user/business_hours.sh
# 周末凌晨4点执行
0 4 * * 6,0 /home/user/weekend_task.sh
8. 环境变量和路径问题
cron 有自己的环境,与用户登录环境不同,因此需要注意:
bash
# 在crontab中设置环境变量
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=user@example.com
# 使用绝对路径
0 2 * * * /usr/bin/python3 /home/user/script.py
# 或者先切换到目录再执行
0 2 * * * cd /home/user && /usr/bin/python3 script.py
9. 输出处理
bash
# 重定向输出到文件
0 2 * * * /home/user/backup.sh > /var/log/backup.log 2>&1
# 丢弃所有输出
0 2 * * * /home/user/backup.sh > /dev/null 2>&1
# 只丢弃标准输出,保留错误输出
0 2 * * * /home/user/backup.sh > /dev/null
10. 用户管理
bash
# 查看其他用户的crontab(需要root权限)
crontab -l -u username
# 编辑其他用户的crontab
crontab -e -u username
# 删除其他用户的crontab
crontab -r -u username
11. 系统级 crontab
除了用户级 crontab,还有系统级 crontab:
bash
# 系统级crontab文件
/etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
系统级 crontab 格式稍有不同:
bash
# 系统级格式:分钟 小时 日 月 星期 用户 命令
0 2 * * * root /home/user/backup.sh
12. 权限控制
bash
# 允许用户使用crontab
/etc/cron.allow
# 禁止用户使用crontab
/etc/cron.deny
权限控制流程图
是 是 否 否 是 是 否 否 用户执行 crontab 检查权限文件 /etc/cron.allow 存在? 用户在allow列表中? 允许访问 拒绝访问 /etc/cron.deny 存在? 用户在deny列表中? 系统默认策略 通常允许所有用户 执行crontab操作 显示权限错误
13. 调试技巧
bash
# 查看cron日志
tail -f /var/log/cron
# 或
tail -f /var/log/syslog | grep cron
# 测试cron时间表达式
# 可以使用在线工具如:https://crontab.guru/
# 手动测试脚本环境
sudo -u username /home/user/script.sh
14. 最佳实践
- 使用绝对路径
- 设置正确的环境变量
- 记录日志便于调试
- 测试脚本在cron环境下的运行
- 避免过于频繁的任务
- 使用锁定机制防止重复执行
15. 完整示例配置
bash
# 编辑crontab
crontab -e
# 添加以下内容
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@company.com
HOME=/home/user
# 备份任务
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
# 监控任务
*/5 * * * * /home/user/scripts/monitor.sh > /dev/null 2>&1
# 清理任务
0 4 * * 0 /home/user/scripts/cleanup.sh
# 报告任务
0 9 * * 1-5 /home/user/scripts/daily_report.sh