【Linux|crontab】crontab理论
crontab 是 Unix/Linux 系统中用于管理定时任务的工具,它让用户可以通过简单的配置,在指定时间执行某些命令或脚本。以下是对 crontab 的详细解析:
1. crontab 的基本组成
crontab 文件的每一行定义一个定时任务,其格式如下:
分 时 日 月 星期 命令
- 分(minute):范围 0-59
- 时(hour):范围 0-23(24 小时制)
- 日(day of month):范围 1-31
- 月(month):范围 1-12
- 星期(day of week):范围 0-7(0 和 7 都表示星期日)
示例:
15 14 1 * * /path/to/script.sh
解释:每月 1 日的 14:15 执行脚本 /path/to/script.sh。
2. 特殊符号的含义
crontab 支持使用特殊符号设置更灵活的时间:
| 符号 | 含义 |
|---|---|
* | 表示任何值。例如:* 在分钟位表示每分钟都执行任务。 |
, | 用逗号分隔多个值。例如:1,15 表示第 1 分钟和第 15 分钟执行任务。 |
- | 指定范围。例如:1-5 表示从第 1 分钟到第 5 分钟都执行任务。 |
/ | 表示步长。例如:*/5 表示每 5 分钟执行一次;1-10/2 表示从第 1 分钟开始,每 2 分钟执行一次。 |
? | 仅用于 day of month 和 day of week 字段,表示无关值(在 crontab 不常用)。 |
示例:
*/10 * * * * /path/to/script.sh
解释:每 10 分钟执行一次脚本 /path/to/script.sh。
3. 特殊时间格式
crontab 还支持一些预定义的特殊时间格式,用来简化常见任务的配置:
| 符号 | 等价表达式 | 含义 |
|---|---|---|
@reboot | – | 在系统启动时运行一次 |
@yearly | 0 0 1 1 * | 每年一次,1 月 1 日 00:00 执行 |
@annually | 0 0 1 1 * | 同 @yearly |
@monthly | 0 0 1 * * | 每月一次,1 日 00:00 执行 |
@weekly | 0 0 * * 0 | 每周一次,星期日 00:00 执行 |
@daily | 0 0 * * * | 每日一次,00:00 执行 |
@midnight | 0 0 * * * | 同 @daily |
@hourly | 0 * * * * | 每小时一次,每小时第 0 分钟执行 |
示例:
@reboot /path/to/script.sh
解释:在系统重启时执行脚本 /path/to/script.sh。
4. 操作 crontab
查看定时任务
- 查看当前用户的任务:
crontab -l
- 查看其他用户的任务(需要
sudo):
sudo crontab -u username -l
编辑定时任务
- 使用默认编辑器编辑任务:
crontab -e
删除定时任务
- 清空当前用户的所有定时任务:
crontab -r
检查定时任务是否有效
crontab文件保存时,系统会自动检查语法是否正确。- 若需手动验证:
crontab -u username -l | crontab -
5. crontab 配置实例
示例 1:每天凌晨 1 点备份数据库
0 1 * * * /usr/bin/python3 /home/user/backup.py >> /home/user/backup.log 2>&1
示例 2:每小时的第 10 和 50 分钟执行任务
10,50 * * * * /home/user/script.sh
示例 3:工作日的每天下午 2 点到 6 点,每 30 分钟执行任务
*/30 14-18 * * 1-5 /home/user/weekday_task.sh
示例 4:每月的最后一天运行脚本
59 23 28-31 * * [ "$(date +\%d -d tomorrow)" == "01" ] && /home/user/end_of_month.sh
6. 日志与调试
查看 cron 日志
- 系统
cron任务日志通常在以下位置:
/var/log/cron
/var/log/syslog # 部分系统
- 查看日志内容:
tail -f /var/log/cron
调试 crontab
- 确保
cron服务正在运行:
systemctl status cron
- 如果脚本不执行,常见问题:
- 路径问题:
cron使用的环境变量较少,可能需要指定完整路径。bash PATH=/usr/local/bin:/usr/bin:/bin - 权限问题:确保脚本和日志文件可被当前用户访问。
- 输出检查:将任务输出写入日志文件排查问题。
7. 环境变量
在 crontab 文件中,支持设置环境变量:
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=user@example.com
SHELL=/bin/bash
PATH:指定任务的执行路径。MAILTO:将任务输出通过邮件发送到指定邮箱。SHELL:指定脚本使用的 shell 类型。
通过以上详解,你可以灵活使用 crontab 进行定时任务管理,适用于各种场景的任务调度!