28、Linux 系统定时任务

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 用户级 crontabcrontab -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. 注意事项

  1. 环境变量问题
    cron 的执行环境变量与用户登录后的环境不同,命令必须写绝对路径 (如 /usr/bin/python3 而非 python3)。

    若脚本依赖自定义环境变量,可在任务开头 source /etc/profile 指定环境配置:

    bash 复制代码
    */5 * * * * source /etc/profile; /opt/script/test.sh
  2. 脚本权限

    确保执行的脚本有可执行权限:

    bash 复制代码
    chmod +x /opt/script/monitor.sh
  3. 避免任务重叠

    若任务执行时间较长,需确保上一次任务完成后再执行下一次。可通过锁文件实现:

    bash 复制代码
    */5 * * * * flock -xn /tmp/lock.file -c "/opt/script/long_run.sh"
  4. 日志排查

    定时任务的执行日志可通过以下路径查看:

    bash 复制代码
    less /var/log/cron
  5. 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 的工作原理

  1. anacron 会读取 /var/spool/anacron/ 下的状态文件(如 cron.daily),记录每个任务上一次执行的日期。
  2. 系统开机后,anacron 被触发,对比「当前日期」和「状态文件中的上次执行日期」,计算间隔天数。
  3. 若间隔天数 ≥ 任务配置的 period_days,且当前时间在 START_HOURS_RANGE(默认 3-22 点)内,则等待 delay_minutes 后执行任务。
  4. 任务执行完成后,anacron 更新状态文件中的上次执行日期为当前日期。
相关推荐
火车叼位19 分钟前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
css趣多多26 分钟前
add组件增删改的表单处理
java·服务器·前端
予枫的编程笔记31 分钟前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun32 分钟前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__40 分钟前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
野犬寒鸦40 分钟前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
陈桴浮海41 分钟前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
迎仔43 分钟前
06-存储设备运维进阶:算力中心的存储管家
运维
生活很暖很治愈1 小时前
Linux——环境变量PATH
linux·ubuntu
?re?ta?rd?ed?1 小时前
linux中的调度策略
linux·运维·服务器