Linux 系统中实现定时任务的核心工具是 crontab ,它基于 cron 守护进程周期性执行指定命令或脚本,同时还可以配合 anacron 处理非 7×24 运行的服务器任务补执行
1. 核心基础
a. cron 守护进程
定时任务的执行依赖 cron 服务,需确保该服务处于运行状态:
bash
# 查看状态
systemctl status crond
# 启动服务
systemctl start crond
# 设置开机自启
systemctl enable crond
b. 任务配置文件分类
| 类型 | 路径 | 说明 |
|---|---|---|
| 用户级 | /var/spool/cron/[用户名] |
每个用户独立的任务文件,通过 crontab 命令管理,无需手动编辑 |
| 系统级 | /etc/crontab |
系统全局任务,需指定执行用户(如 root)需要手动通过 vim /etc/crontab 维护定时任务 |
| 自定义 | /etc/cron.d/ |
存放自定义系统任务,格式同 /etc/crontab |
| 特性 | /etc/crontab |
用户级 crontab(crontab -e) |
|---|---|---|
| 管理方式 | 直接用文本编辑器(vim)编辑 | 用 crontab -e/-l/-r 命令管理 |
| 执行用户 | 配置中明确指定(必填字段) | 默认为编辑该任务的当前用户 |
| 适用场景 | 系统级全局任务(如清理系统日志、系统备份) | 单个用户的个性化任务(如用户数据备份) |
| 权限要求 | 仅 root 或拥有 sudo 权限的用户可编辑 | 普通用户可编辑自己的任务(无需 root) |
2. crontab 语法格式
a. 时间字段格式
- 用户级任务的时间表达式由 5 个字段组成
- 系统级任务(
/etc/crontab)需额外加执行用户字段,格式如下:
bash
# 用户级格式
分钟 小时 日 月 星期 命令/脚本
# 系统级格式
分钟 小时 日 月 星期 执行用户 命令/脚本
i. 字段取值范围
| 字段 | 取值范围 | 特殊说明 |
|---|---|---|
| 分钟 | 0--59 | --- |
| 小时 | 0--23 | --- |
| 日 | 1--31 | 注意月份天数和闰月 |
| 月 | 1--12 | 也可写英文缩写(Jan/Dec) |
| 星期 | 0--7 | 0 和 7 均代表周日,1 代表周一 |
ii. 特殊符号
| 符号 | 作用示例 | 说明 |
|---|---|---|
* |
* * * * * |
匹配该字段的所有值,即每分钟执行 |
/ |
*/5 * * * * |
表示步长,每 5 分钟执行一次 |
, |
10,20,30 * * * * |
表示多个离散值,第10、20、30分钟执行 |
- |
10-20 * * * * |
表示连续范围,第10到20分钟每分钟执行 |
b. 常用 crontab 命令
| 命令 | 作用 |
|---|---|
crontab -e |
编辑当前用户的定时任务(默认使用 vi 编辑器) |
crontab -l |
列出当前用户的所有定时任务 |
crontab -r |
删除当前用户的所有定时任务(谨慎使用) |
crontab -u [用户名] -l |
查看指定用户的定时任务(需 root 权限) |
crontab -u [用户名] -e |
编辑指定用户的定时任务(需 root 权限) |
3. 示例
以下案例均为用户级任务 (以 root 用户为例,执行 crontab -e 编辑),命令/脚本建议写绝对路径。
a. 每 5 分钟执行一次脚本
bash
*/5 * * * * /opt/script/monitor.sh >> /opt/log/monitor.log 2>&1
>> /opt/log/monitor.log:将标准输出追加到日志文件2>&1:将标准错误重定向到标准输出,统一记录日志
b. 每天凌晨 2:30 备份 MySQL 数据库
bash
30 2 * * * /usr/bin/mysqldump -uroot -p'密码' 数据库名 > /data/backup/db_$(date +%Y%m%d).sql
$(date +%Y%m%d):生成年月日格式的文件名(如db_20260116.sql)- 注意:密码建议写在
~/.my.cnf配置文件中,避免明文暴露
c. 每周日晚上 10 点清理日志
bash
0 22 * * 0 /bin/rm -rf /var/log/nginx/*.log
d. 每月 1 号和 15 号的凌晨 3 点同步数据
bash
0 3 1,15 * * /opt/script/data_sync.sh
4. 注意事项
-
环境变量问题
cron的执行环境变量与用户登录后的环境不同,命令必须写绝对路径 (如/usr/bin/python3而非python3)。若脚本依赖自定义环境变量,可在任务开头
source /etc/profile指定环境配置:bash*/5 * * * * source /etc/profile; /opt/script/test.sh -
脚本权限
确保执行的脚本有可执行权限:
bashchmod +x /opt/script/monitor.sh -
避免任务重叠
若任务执行时间较长,需确保上一次任务完成后再执行下一次。可通过锁文件实现:
bash*/5 * * * * flock -xn /tmp/lock.file -c "/opt/script/long_run.sh" -
日志排查
定时任务的执行日志可通过以下路径查看:
bashless /var/log/cron -
anacron 补执行
若服务器关机,
cron会错过期间的任务;anacron可在系统开机后自动补执行错过的任务,适合非 7×24 运行的服务器。
5. anacron 简要说明
a. anacron 配置文件
/etc/anacrontab,核心字段:
周期天数 延迟分钟 任务标识 执行命令
1 5 cron.daily run-parts /etc/cron.daily
7 20 cron.weekly run-parts /etc/cron.weekly
- 周期天数:任务执行间隔(如 1 代表每天,7 代表每周)
- 延迟分钟:系统开机后延迟多久执行
b. anacron 的工作原理
anacron会读取/var/spool/anacron/下的状态文件(如cron.daily),记录每个任务上一次执行的日期。- 系统开机后,
anacron被触发,对比「当前日期」和「状态文件中的上次执行日期」,计算间隔天数。 - 若间隔天数 ≥ 任务配置的
period_days,且当前时间在START_HOURS_RANGE(默认 3-22 点)内,则等待delay_minutes后执行任务。 - 任务执行完成后,
anacron更新状态文件中的上次执行日期为当前日期。