什么是crontab
crontab是Linux系统自带的定时任务调度工具,它可以让系统按照预设的时间周期自动执行脚本或命令。无论是日志轮转、数据备份、证书续期还是监控报警,crontab都是服务器运维中最基础也最常用的自动化手段。
crontab的名字来源于cron(时间守护进程)+ table(表格),本质上就是一张告诉系统"什么时间做什么事"的规则表。
crontab基础语法
每条crontab规则由6个字段组成,用空格分隔:
* * * * * command 分 时 日 月 周 要执行的命令
各字段取值范围:
- 分:0-59
- 时:0-23
- 日:1-31
- 月:1-12
- 周:0-7(0和7都代表周日)
特殊符号详解
crontab支持4个特殊符号,灵活组合可以覆盖几乎所有调度需求:
- *(星号) — 每个取值都匹配,相当于"每"
- ,(逗号) — 列举多个离散值,如 1,15 表示1号和15号
- -(连字符) — 连续范围,如 1-5 表示1到5
- /(斜杠) — 步长间隔,如 */5 表示每隔5个单位
组合示例:0 8-18/2 * * 1-5 表示工作日8点到18点每隔2小时执行。
常用crontab命令
crontab -e # 编辑当前用户的定时任务 crontab -l # 列出当前用户的所有定时任务 crontab -r # 删除当前用户的所有定时任务 crontab -u root -l # 查看指定用户的定时任务(需root权限)
编辑时系统会调用默认编辑器(通常是vi或nano),保存后cron会自动加载新规则,无需重启服务。
10个实战案例
以下是从简单到进阶的10个常见场景:
- 每分钟执行:
* * * * * /path/to/script.sh - 每天凌晨3点备份:
0 3 * * * /root/backup.sh - 每小时执行:
0 * * * * /path/to/check.sh - 每5分钟检查服务:
*/5 * * * * /usr/bin/check_service.sh - 工作日早9点执行:
0 9 * * 1-5 /path/to/work.sh - 每月1号凌晨2点:
0 2 1 * * /root/monthly.sh - 每周日凌晨4点清理:
0 4 * * 0 /root/cleanup.sh - 每天6:30和18:30:
30 6,18 * * * /path/to/sync.sh - 每季度第一天:
0 0 1 1,4,7,10 * /root/quarterly.sh - 每10秒执行(变通写法):需要配合sleep,写3条规则间隔20秒
环境变量陷阱
这是很多人踩过的坑:crontab执行环境和你登录的Shell环境不一样。cron会提供一个精简的环境,PATH通常只有/usr/bin:/bin,很多你自己安装的命令可能找不到。
解决方案:
- 在脚本中使用命令的完整路径,如 /usr/local/bin/python3
- 在crontab文件顶部手动设置PATH:
PATH=/usr/local/bin:/usr/bin:/bin - 在脚本开头 source ~/.bashrc 或 source /etc/profile
另一个常见问题:crontab中的%有特殊含义(换行符),日期格式化时必须转义:\%Y-\%m-\%d,否则命令会报错。
日志与调试
crontab任务不执行是最让人头疼的问题,以下是排查步骤:
- 查看cron日志:grep CRON /var/log/syslog(Ubuntu)或 grep CROND /var/log/cron(CentOS)
- 重定向输出:在命令后添加重定向到日志文件来捕获错误信息
- 检查cron服务:
systemctl status cron或systemctl status crond - 验证脚本权限:
chmod +x /path/to/script.sh - 检查换行符:确保脚本不是Windows格式的CRLF换行,用 dos2unix 转换
特殊时间宏
部分cron实现支持这些快捷写法:
@reboot— 系统启动时执行一次@yearly或@annually— 每年1月1日0点@monthly— 每月1日0点@weekly— 每周日0点@daily或@midnight— 每天0点@hourly— 每小时0分
其中 @reboot 特别实用,常用于启动某些守护进程或初始化脚本。
安全注意事项
- 允许使用crontab的用户由 /etc/cron.allow 和 /etc/cron.deny 控制,优先级:allow 大于 deny
- 不要在crontab命令中硬编码密码,改用密钥文件或环境变量
- 定时清理过期的crontab任务,避免无人维护的"僵尸任务"消耗资源
- 生产环境建议用 /etc/cron.d/ 目录管理任务,每个任务一个文件,方便版本控制
/etc/cron.d vs crontab -e
两者的核心区别:
- crontab -e:用户级别,每个用户一份,适合个人任务
- /etc/cron.d/:系统级别,可以指定执行用户,适合运维团队协作管理
- /etc/crontab:系统主crontab文件,格式多一个"用户"字段,不推荐直接改
推荐做法:运维脚本统一放 /etc/cron.d/,个人开发任务用 crontab -e。
常见问题FAQ
Q:crontab修改后需要重启cron服务吗?
A:不需要。cron每分钟会自动检查crontab文件的变化。
Q:为什么我的脚本手动执行正常,crontab里就不行?
A:90%是环境变量问题,参照上面"环境变量陷阱"一节排查。
Q:crontab最小时间间隔是多少?
A:最小1分钟。如果需要秒级调度,可以用systemd timer或者shell循环+sleep。
Q:如何实现"每隔90分钟"执行?
A:crontab做不到非整除间隔,需要换思路:写一个每分钟执行的脚本,内部判断距上次执行是否过了90分钟。
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论