马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
cron 是 Linux 内置的定时任务工具,按预设的时间规则周期性地执行命令或脚本。从日志 清理到备份巡检,几乎每台服务器上都能看到它的身影。这篇把字段含义、语法糖、踩坑点一次讲清。
一、基础概念与布局
时间规则由 5 个字段组成,格式是:分 时 日 月 周 执行命令。
| 字段 | 取值范围 |
| 分钟 | 0-59 |
| 小时 | 0-23 |
| 日期 | 1-31 |
| 月份 | 1-12(也可写英文缩写) |
| 星期 | 0-7(0 和 7 都表示周日) |
二、操作命令
crontab -e # 编辑当前用户的任务
crontab -u username -e # 编辑指定用户的任务(需权限)
crontab -l # 查看当前用户任务
crontab -u username -l # 查看指定用户任务
- 用户级任务:
/var/spool/cron/(RHEL/CentOS)或 /var/spool/cron/crontabs/(Debian/Ubuntu)。
- 系统级任务:
/etc/crontab 与 /etc/cron.d/ 目录。
三、时间规则的特殊符号
| 符号 | 含义 | 示例 | 说明 |
| * | 任意值 | 0 * * * * | 每小时整点执行 |
| , | 多个时间点 | 0 5,17 * * * | 每天 5 点和 17 点执行 |
| - | 时间范围 | 0 0-6 * * * | 每天 0-6 点整点执行 |
| /n | 间隔频率 | */10 * * * * | 每 10 分钟执行 |
四、典型场景写法
* * * * * /bin/sh script.sh # 每分钟执行一次
0 2 * * * /bin/sh script.sh # 每天 02:00 执行一次
0 17 * * sun /bin/sh script.sh # 每周日 17:00 执行一次
*/10 * * * * /bin/sh script.sh # 每 10 分钟执行一次
想要 30 秒执行一次
crontab 的最小粒度是 1 分钟,硬要 30 秒只能拆成两条任务配合 sleep:
* * * * * /bin/sh script.sh
* * * * * sleep 30; /bin/sh script.sh
复合时间条件
0 17 * * 5,7 /bin/sh script.sh # 每周五、周日 17 点
0 4,17 * * 5,7 /bin/sh script.sh # 每周五、周日 4 点和 17 点
* * * jan,may,aug * /bin/sh script.sh # 每年 1、5、8 月的每分钟
带条件判断
例如"每月第一个周日的凌晨 2 点执行":
0 2 * * sun [ $(date +%d) -le 07 ] && /bin/sh script.sh
逻辑拆开看:0 2 * * sun 是时间表达式,每周日 2:00 触发;命令部分 [ $(date +%d) -le 07 ] 里,$(date +%d) 取当前"日"字段,-le 07 判断是否 ≤ 7(也就是每月前 7 天)。两者同时满足才执行脚本。这种写法适合月度首周归档、跨周期报表这类需求。
系统级任务
系统级任务格式里必须多写一项用户:
0 4 * * * root /bin/bash restart_service.sh
五、时间宏(语法糖)
| 宏 | 等效表达式 | 说明 |
| @yearly | 0 0 1 1 * | 每年 1 月 1 日 00:00 执行 |
| @monthly | 0 0 1 * * | 每月 1 日 00:00 执行 |
| @daily | 0 0 * * * | 每天 00:00 执行 |
| @hourly | 0 * * * * | 每小时整点执行 |
| @reboot | 无等效表达式 | 系统启动时执行 |
@yearly 只能精确到"年",像"每年 6 月 1 日"这种仍需用标准表达式。
# 用户级:每年清理一次临时文件
@yearly find /tmp -type f -mtime +365 -delete
# 系统级:生成年度报告(需 root)
@yearly root /opt/reports/generate_annual_report.sh
六、配置的几个注意点
1. 环境变量问题
crontab 默认使用一套极简环境变量,PATH 里未必有你习惯的路径。建议在脚本里用绝对路径,或在任务中显式声明 PATH,否则经常出现命令找不到。
2. 日志 与调试
- 执行记录:
/var/log/cron。
- 输出重定向:
0 * * * * /script.sh > /log.txt 2>&1,不重定向的话输出会作为邮件发给对应用户。
3. 服务管理
systemctl restart crond # 改完系统级配置后重启服务(CentOS 7+ 的服务名是 crond,Ubuntu 多为 cron)
4. 备份与恢复
crontab -l > cron_backup.txt # 备份
crontab cron_backup.txt # 恢复
七、小结
- 五个字段:分、时、日、月、周,星号、逗号、短横、斜杠四个符号覆盖绝大多数需求。
- 写脚本用绝对路径、输出重定向、任务前声明 PATH,能避开九成"本地跑得好好的服务器不执行"的坑。
- 30 秒级任务靠两条任务加 sleep 拆分;常见周期用 @daily、@hourly 这类宏更整洁。
- 完整手册查
man crontab,改完最好加个测试任务验证是否真的触发。
qidao123.com企服评测-应用市场 编辑提示 |