Linux 定时任务最主流就是crontab(cron),属于老牌标准定时调度,按分钟级别周期执行脚本 / 命令,运维做日志切割、数据备份、定时同步非常常用;另外还有 systemd timer,是 systemd 自带的定时方案,作为 cron 现代替代方案,支持秒级精度、依赖管理、日志更完善。除这两个之外,还有 at 命令,只执行一次性定时任务,不是周期循环。核心重点是 crontab 五段时间表达式语法,这是新手最容易出错的地方,同时掌握 crontab 增删改查、日志排查、权限控制、常见不执行故障排查。
一、crontab 周期定时任务(核心重点)
基础命令
| 命令 | 功能 |
|---|---|
| crontab -e | 编辑当前用户定时任务 |
| crontab -l | 列出当前用户所有定时任务 |
| crontab -r | 删除当前用户全部定时任务 |
| crontab -u 用户名 -e | 指定其他用户编辑定时任务(root 权限) |
| crontab -u 用户名 -l | 查看指定用户定时任务 |
crontab 时间表达式(5 位)
分 时 日 月 周 要执行的命令/脚本
| 字段 | 范围 | 说明 |
|---|---|---|
| 分 | 0-59 | 分钟 |
| 时 | 0-23 | 小时 |
| 日 | 1-31 | 日期 |
| 月 | 1-12 | 月份 |
| 周 | 0-7 | 星期,0 和 7 都代表周日 |
特殊符号
代表每
, 分隔多个值,比如 1,3,5
- 范围,比如 9-18
/ 步长,比如 /5 每 5 分钟
经典示例
每5分钟执行一次备份脚本
/5 /bin/bash /opt/backup.sh
每天凌晨2点执行
0 2 /opt/clean_log.sh
每周一凌晨3点
0 3 1 /opt/weekly_backup.sh
每天8点到18点,每小时整点
0 8-18 /opt/task.sh
重要坑点:crontab 环境变量和交互式 shell 不一样,PATH 不完整,脚本里面命令建议写绝对路径,输出重定向 >> /var/log/cron.log 2>&1 保存错误日志,很多定时任务不执行就是这个原因
cron 相关目录(系统级定时任务)
/etc/crontab 系统全局 crontab 文件,多了用户字段
/etc/cron.d/ 自定义定时任务文件存放目录
/etc/cron.hourly 每小时执行
/etc/cron.daily 每天执行
/etc/cron.weekly 每周执行
/etc/cron.monthly 每月执行
服务管理
CentOS/Rocky
systemctl status crond
systemctl enable crond
Ubuntu/Debian
systemctl status cron
systemctl enable cron
日志位置
/var/log/cron (RHEL 系)
/var/log/syslog (Debian/Ubuntu,grep CRON 查看)
二、at 一次性定时任务
特点:只执行一次,到点运行,不是循环周期任务
基础命令
at 时间
进入交互模式输入要执行命令,Ctrl+D 提交
atq 查看待执行任务
atrm 任务编号 删除 at 任务
示例:今晚 23 点执行脚本
at 23:00
三、systemd timer 现代定时方案
原理:.timer 单元 + 对应的.service 单元,精度更高,日志集成 journald,适合新系统
基础示例
编写 xxx.timer,配置 OnCalendar 定时时间,然后
systemctl daemon-reload
systemctl enable --now xxx.timer
查看状态
systemctl list-timers
四、三种定时方案对比表
| 方案 | 类型 | 精度 | 优点 | 缺点 |
|---|---|---|---|---|
| crontab cron | 周期循环 | 最小 1 分钟 | 成熟通用,上手简单 | 不支持秒级,环境变量坑多 |
| at | 一次性任务 | 分钟级 | 临时单次任务 | 不能循环 |
| systemd timer | 周期循环 | 支持更高精度 | 和 systemd 集成,日志完善 | 配置相对复杂 |
五、常见故障排查清单
1 crontab 任务不执行:确认 crond 服务是否启动,脚本权限是否可执行,脚本内命令是否写绝对路径
2 时区错误:系统时区不是 Asia/Shanghai,导致定时时间偏移
3 权限问题:普通用户 crontab 执行 root 权限命令失败
4 脚本本身报错:没有重定向 stderr,看不到报错信息
4 禁用用户:/etc/cron.deny/etc/cron.allow 访问控制,用户被禁止使用 crontab
【常见问题】
问题 1 linux 定时任务命令 crontab 时间表达式一共几位
回答 1 linux 定时任务命令 crontab 标准表达式是 5 位:分 时 日 月 周,最小调度粒度是 1 分钟,不支持秒级定时。
问题 2 linux 定时任务命令 crontab -e 和 /etc/crontab 区别
回答 1 linux 定时任务命令 crontab -e 是用户级定时任务,/etc/crontab 是系统全局任务,全局文件多一列执行用户字段。
问题 3 linux 定时任务命令为什么脚本手动可以跑,crontab 里面不执行
回答 1 linux 定时任务命令 crontab 运行环境变量和终端不一样,PATH 环境变量不全,脚本里面命令尽量使用绝对路径,并且把错误输出重定向保存日志排查。
问题 4 linux 定时任务命令 at 和 crontab 有什么区别
回答 1 linux 定时任务命令 at 是一次性定时任务,到点只运行一次;crontab 是周期性循环定时任务,反复按计划执行。
【免责申明】
本文 linux 定时任务命令基于 Vixie cron 标准实现编写,不同发行版 cron 服务名称、日志路径存在差异,执行 man crontab 查看本机手册,生产环境定时脚本做好日志记录与权限管控,内容仅用于 linux 运维学习参考。
