crontab 是什么
crontab 是 cron 体系中管理「用户任务表」的命令。它本身不是编辑器,而是一个安装器:crontab -e 先打开一份临时副本供你编辑,保存退出时由它做格式校验,通过才写入后台 spool 目录(RHEL 系 /var/spool/cron/用户名,Debian 系 /var/spool/cron/crontabs/用户名)。校验失败会报 errors in crontab file, can't install 并放弃写入,原有任务表不受影响。围绕这份任务表,-l、-e、-r、-i、-u 分别对应读取、编辑、删除、确认删除与代管他人。
基本信息
| 适用平台 | Linux 全系(RHEL 系 cronie、Debian 系 vixie-cron);BSD 与 macOS 有同名命令,个别选项语义有差异 |
|---|---|
| 命令语法 | crontab [-u 用户] -l | -e | -r | -i ;crontab [-u 用户] 任务表文件 ;crontab - 从标准输入安装 |
| 常用选项 | -l 列出 / -e 编辑 / -r 删除全部 / -i 删除前交互确认 / -u 指定用户 / - 从标准输入读取 |
| 权限要求 | 操作自己的任务表无需 root;-u 指定他人必须 root 或 sudo;能否使用 crontab 受 /etc/cron.allow 与 /etc/cron.deny 控制 |
典型使用场景
- 新增例行任务:crontab -e 加一行备份或巡检指令,保存退出即生效,不必重启 cron 服务
- 迁移服务器:源机 crontab -l > server-a.bak 导出,目标机 crontab server-a.bak 整份导入,避免逐行手抄出错
- 清理误建任务:先 crontab -l 存档留底,再用 crontab -r 清空,或加 -i 让它逐条确认
- 代管服务账号:sudo crontab -u www -l 查看 www 用户下的任务,这类任务不会出现在 root 的 crontab -l 里
- 受控发布:把任务表文件纳入版本管理,用 crontab 文件 一次性安装,替代在多台机器上手工编辑
常用示例
常用示例
crontab -l # 列出当前用户的任务表
crontab -l > ~/cron.bak # 改前导出备份,属于习惯动作
crontab -e # 编辑,保存退出时校验并安装
crontab -ri # 删除前逐个确认(-i 与 -r 组合)
crontab server-a.bak # 用文件整份替换当前任务表
crontab - < server-a.bak # 从标准输入安装,效果同上
sudo crontab -u www -l # 查看 www 用户的任务表(需 root)备份与回滚
备份与回滚
# 改动前先留底
crontab -l > /root/cron-$(date +%F).bak
# 改坏了:用备份整份覆盖回去
crontab /root/cron-2026-10-13.bak
# 核对结果是否与备份一致
crontab -l | diff - /root/cron-2026-10-13.bak选项与风险对照
| 选项 | 作用 | 风险与提示 |
|---|---|---|
| -l | 打印当前用户任务表到标准输出 | 只读,可放心重定向到文件做备份 |
| -e | 编辑并校验后安装 | 校验不过会拒绝安装,原任务表保留不变 |
| -r | 删除整张任务表 | 多数实现无提示直接清空,spool 里不留历史版本 |
| -i | 删除前逐条交互确认 | 多数实现支持,个别系统默认开启,脚本里不要依赖它 |
| -u 用户 | 指定操作对象 | 需 root;用户名写错就会改到别人的任务表 |
保存后不需要重启服务:cron 守护进程每分钟检查 spool 目录的变化,自动重载被改动的任务表,这就是「保存即生效」的机制。
crontab -e 依赖 EDITOR 或 VISUAL 环境变量:最小化系统里可写 EDITOR=vim crontab -e,或把 export EDITOR=vim 放进 shell 配置长期生效。
crontab -r 与 -u 组合能删掉他人的任务表,而且没有回收站。执行前先 crontab -u 用户 -l > 备份,确认目标用户名再敲回车。
任务表六个字段
| 字段 | 取值范围 | 说明 |
|---|---|---|
| 分 | 0-59 | 每分钟写 *,每 5 分钟写 */5 |
| 时 | 0-23 | 按服务器本地时区解释,不是 UTC |
| 日 | 1-31 | 与周字段不要同时限定,否则范围会被放大 |
| 月 | 1-12 | 可用英文缩写 jan-dec |
| 周 | 0-7 | 0 与 7 都表示周日 |
| 命令 | 任意命令行 | 百分号有特殊含义,需要转义成反斜杠加百分号 |
常见时间写法
- 每 5 分钟一次:星号斜杠 5 开头,分字段写成 */5,其余为星号
- 每天凌晨 2 点:分写 0、时写 2,其余为星号
- 每周日 3 点:再在周字段写 0,注意不要同时填日字段
- 字符串写法:@daily、@weekly、@monthly、@reboot 比五段式更易读,支持程度以发行版实现为准
- 日与周同时指定时,多数实现按「满足其一即触发」处理,等于执行范围被放大
任务按系统本地时区执行,跨机房机器时区不一致时,同一条任务会在不同时刻触发;容器里还要再确认容器自身的时区,否则出现「宿主机对了、容器慢 8 小时」的偏差。
输出去向:cron 会把任务的标准输出与错误输出以邮件发给任务所有者,多数机器没有可用的本地邮件系统,输出就这样被丢弃。脚本里一律显式重定向到日志文件,排查时才有据可依。