crontab 是什么
crontab 是 Linux 上用户级定时任务的编辑入口,任务表存在 /var/spool/cron/<用户名> 下,由 crond 守护进程每分钟扫一遍,命中时间点就 fork 出 shell 执行命令。它的运行环境极简:只带很小的 PATH,没有交互式登录时的别名与变量,所以任务里的命令要写绝对路径。麒麟 V10、UOS 服务器版、openEuler 都预装 cronie 提供 crond,用法一致。系统级任务另有 /etc/crontab 与 /etc/cron.d/,格式比用户级多一个「以哪个用户执行」的字段,两者不要混用。
基本信息
| 所属 | cronie(crond 守护进程) |
|---|---|
| 用户任务表 | /var/spool/cron/<用户名> |
| 系统级任务 | /etc/crontab、/etc/cron.d/、/etc/cron.{hourly,daily,weekly} |
| 时间粒度 | 分钟级,无法表达秒级 |
| 执行环境 | 极简 PATH,通常为 /usr/bin:/bin |
| 日志 | /var/log/cron(配合 rsyslog) |
典型使用场景
- 定时同步或备份:每天凌晨把数据推送到备份服务器
- 周期清理:定期删过期临时文件、截断巨大日志
- 业务脚本兜底:接口对账、报表生成、证书到期检查
- 巡检采集:每五分钟抓一次负载与端口状态落库
- 延迟执行一次任务:用 at 之外的变通写法排未来某个时间点
- 给应用用户单独排任务:用 crontab -u 指定业务账号而不是 root
基本操作
基本操作
crontab -l # 列出当前用户的任务,改前先备份输出
crontab -e # 编辑当前用户任务
EDITOR=vim crontab -e # 指定编辑器,避免默认编辑器不熟
crontab -l -u www # root 查看指定用户的任务
crontab -e -u www # root 编辑指定用户的任务
crontab -r # 删除当前用户全部任务,无确认,慎用时间字段逐列读法
| 字段 | 取值范围 | 常见写法 |
|---|---|---|
| 分钟 | 0-59 | * 每分钟,*/10 每十分钟 |
| 小时 | 0-23 | 0 表示零点,2-4 表示区间 |
| 日 | 1-31 | 注意与月、星期组合仍按 cron 规则计算 |
| 月 | 1-12 | 有时用英文缩写替代 |
| 星期 | 0-7(0 与 7 都是周日) | 1-5 表示工作日 |
| 用户 | 仅系统级 crontab 有 | 用户级 crontab 没有这一列 |
任务行示例
任务行示例
PATH=/usr/local/bin:/usr/bin:/bin # cron 环境变量写在表头,供全局使用
MAILTO="" # 置空,避免输出被投递到本地邮箱堆积
*/10 * * * * /usr/bin/flock -n /tmp/sync.lock /opt/scripts/sync.sh >> /var/log/sync.log 2>&1
0 2 * * * /usr/bin/find /data/tmp -type f -mtime +7 -delete >> /var/log/tmp-clean.log 2>&1
30 3 * * 0 /opt/scripts/full-backup.sh >> /var/log/full-backup.log 2>&1 # 每周日 3:30crontab -r 会直接删掉当前用户的整张任务表,而且没有任何确认。要删单条任务请进 crontab -e 编辑,编辑前先 crontab -l 把内容备份到文件。
任务输出不重定向时,cron 会尝试投递给本地邮箱;若 MAILTO 有值且邮件服务不可用,堆积在 /var/spool/mail 里反而占空间。标准做法是任务里显式重定向到日志文件,并把 MAILTO 置空,日志自己配轮转。
cron 只能跑分钟级,也不处理机器关机期间错过的任务。需要秒级精度、依赖关系、错过补偿或更清晰的执行记录时,改用 systemd timer 更合适;需要「漏了也要补跑」的场景可用 anacron 或把最后一次执行时间记在文件里自检。