首页/系统/信创系统运维速查/crontab 用户级计划任务
服务与运维65 条

crontab 用户级计划任务

crontab -e 编辑当前用户任务、-l 列出、-u 指定用户;任务行写绝对路径命令,输出重定向到日志或按 MAILTO 发送,避免任务跑了但错误被吞。

信创系统运维速查系统更新于 2026-10-13

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-230 表示零点,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:30
crontab -r 会直接删掉当前用户的整张任务表,而且没有任何确认。要删单条任务请进 crontab -e 编辑,编辑前先 crontab -l 把内容备份到文件。
任务输出不重定向时,cron 会尝试投递给本地邮箱;若 MAILTO 有值且邮件服务不可用,堆积在 /var/spool/mail 里反而占空间。标准做法是任务里显式重定向到日志文件,并把 MAILTO 置空,日志自己配轮转。
cron 只能跑分钟级,也不处理机器关机期间错过的任务。需要秒级精度、依赖关系、错过补偿或更清晰的执行记录时,改用 systemd timer 更合适;需要「漏了也要补跑」的场景可用 anacron 或把最后一次执行时间记在文件里自检。

易错点

  • cron 会话的 PATH 很短,脚本里调用的命令不加绝对路径就会报 command not found,且这类错误只在日志里可见
  • 把所有任务都塞进 root 的 crontab:业务脚本应尽量用专用账号跑,避免脚本被利用时直接拿到最高权限
  • 多台机器同一时间点跑重任务,造成整点资源争抢,应错开分钟或加 flock 串行锁
  • 把任务日志追加到无限增长的文件而不配轮转,磁盘最终被日志写满

数据来源与参考

  • man 1 crontab
  • man 5 crontab
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌