什么是 Cron?
Cron 是 Linux 系统自带的定时任务工具,可以按照设定的时间自动执行命令或脚本。运维中几乎所有自动化任务都离不开它:备份、清理、监控、同步…
基础用法
crontab 命令
| |
格式说明
* * * * * command
分 时 日 月 周 要执行的命令
# 取值范围
# 分:0-59
# 时:0-23
# 日:1-31
# 月:1-12
# 周:0-7(0和7都是周日)
特殊符号
| 符号 | 含义 | 示例 |
|---|---|---|
* | 任意值 | * 表示每一分钟 |
, | 多个值 | 1,15,30 第1/15/30分钟 |
- | 范围 | 1-5 周一到周五 |
/ | 间隔 | */5 每 5 分钟 |
常用示例
按分钟执行
| |
按小时执行
| |
按天执行
| |
按周执行
| |
按月执行
| |
特殊时间字符串
Cron 还支持一些预定义的字符串:
| 字符串 | 等价于 | 说明 |
|---|---|---|
@reboot | - | 开机时执行 |
@yearly | 0 0 1 1 * | 每年一次 |
@monthly | 0 0 1 * * | 每月一次 |
@weekly | 0 0 * * 0 | 每周一次 |
@daily | 0 0 * * * | 每天一次 |
@hourly | 0 * * * * | 每小时一次 |
| |
实用场景
1. 自动备份
| |
💡 注意:crontab 里
%是特殊字符,需要转义成\%
2. 定期清理
| |
3. 监控告警
| |
4. 同步任务
| |
排错技巧
Cron 不执行?排查思路
1. 检查 cron 服务
| |
2. 看系统日志
| |
3. 脚本本身问题
- 脚本有没有执行权限?
- 路径是不是写的绝对路径?(cron 的 PATH 很少)
- 环境变量是不是缺失?
4. 重定向日志
| |
最佳实践
1. 用脚本包装
不要把复杂命令直接写在 crontab 里,写成脚本:
| |
2. 加注释
| |
3. 避免同时刻扎堆
如果有多个定时任务,不要都放在 0 * * * * 整点执行,分散开:
| |
4. 加锁防止重叠
如果任务可能执行超过间隔时间,用 flock 加锁:
| |
5. 不要用 root 跑所有任务
能不用 root 就不用,用专用用户跑对应的任务。
常见坑
坑1:环境变量不一样
Cron 的环境变量很少,PATH 里可能没有 /usr/local/bin 之类的路径。
解决方法:脚本开头加:
| |
坑2:百分号需要转义
crontab 里 % 表示换行,要用 \% 转义。
| |
坑3:工作目录不一样
Cron 的默认工作目录是用户的 home 目录,不是脚本所在目录。
解决方法:脚本里先 cd 到自己的目录:
| |
坑4:中文字符乱码
脚本里有中文会乱码,设置一下 locale:
| |
总结
Cron 是 Linux 运维的基本功,简单但容易踩坑。记住几个原则:
- 用脚本不用长命令
- 写注释说清楚用途
- 重定向日志方便排查
- 路径全部用绝对路径
- 改完记得验证
自动化运维从 Cron 开始 ⏰
