Crontab 配置规则详解
crontab
是 Linux/Unix 系统中用于设置定时任务的工具,允许用户按固定时间周期执行命令或脚本。以下是它的核心配置规则:
1. 基本语法
* * * * * <command-to-execute>
│ │ │ │ │
│ │ │ │ └── 星期几 (0 - 6, 0=星期日)
│ │ │ └──── 月份 (1 - 12)
│ │ └────── 日 (1 - 31)
│ └──────── 小时 (0 - 23)
└────────── 分钟 (0 - 59)
*
表示“每”(如* * * * *
每分钟执行一次)。,
表示多个时间点(如0,15,30 * * * *
每小时的 0、15、30 分执行)。-
表示范围(如0 9-18 * * *
每天 9 点到 18 点整点执行)。/
表示间隔(如*/5 * * * *
每 5 分钟执行一次)。
2. 常用示例
示例 | 说明 |
---|---|
* * * * * cmd |
每分钟执行一次 |
1 * * * * * cmd |
每小时的第1分钟执行一次 |
*/5 * * * * cmd |
每 5 分钟执行一次 |
0 * * * * cmd |
每小时整点执行 |
0 0 * * * cmd |
每天午夜执行 |
0 9 * * 1-5 cmd |
工作日(周一到周五)上午 9 点执行 |
0 0 1 * * cmd |
每月 1 号午夜执行 |
@reboot cmd |
系统启动时执行(仅部分 cron 支持) |
@daily cmd |
每天午夜执行(等价于 0 0 * * * ) |
@hourly cmd |
每小时执行(等价于 0 * * * * ) |
3. 特殊符号与变量
(1)环境变量
cron
默认环境与终端不同,建议在 crontab
开头定义:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin
MAILTO=user@example.com # 任务输出发送到指定邮箱
(2)转义 %
如果命令中包含 %
(如 date +%Y
),需转义为 \%
:
* * * * * echo "Time: $(date +\%Y-\%m-\%d)" >> /tmp/log
4. 日志与调试
(1)查看 cron
日志
- Ubuntu/Debian:
grep CRON /var/log/syslog
- CentOS/RHEL:
grep CRON /var/log/cron
(2)捕获错误输出
* * * * * /path/to/script.sh >> /tmp/log 2>&1
>> /tmp/log
:追加标准输出到文件。2>&1
:将错误输出重定向到标准输出。
5. 注意事项
路径问题
cron
默认从用户家目录执行,脚本中需使用绝对路径。- 示例:
* * * * * /usr/bin/python3 /home/user/script.py
权限问题
- 确保脚本有可执行权限:
chmod +x /path/to/script.sh
- 如果任务需
sudo
,建议直接以root
用户配置crontab
。
- 确保脚本有可执行权限:
时间同步
- 如果服务器时间不准,
cron
任务会受影响,建议启用 NTP:timedatectl set-ntp true
- 如果服务器时间不准,
最小间隔
cron
最小时间单位为 1 分钟,如需秒级任务,改用sleep
循环或systemd
定时器。
6. 管理 crontab
命令 | 说明 |
---|---|
crontab -e |
编辑当前用户的定时任务 |
crontab -l |
列出当前用户的任务 |
crontab -r |
删除所有任务(慎用!) |
crontab -u root -e |
编辑指定用户的任务(需权限) |
7. 示例:备份数据库
0 3 * * * /usr/bin/mysqldump -u root -pPASSWORD dbname > /backup/db_$(date +\%Y\%m\%d).sql
- 每天凌晨 3 点备份 MySQL 数据库。
总结
- 时间字段:
分钟 小时 日 月 星期
。 - 特殊符号:
* , - /
。 - 调试技巧:检查日志、捕获错误输出、使用绝对路径。
- 秒级任务:需借助
while + sleep
或systemd
。
通过合理配置 crontab
,可以实现自动化运维任务(如备份、监控、清理日志等)。