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 更新状态文件中的上次执行日期为当前日期。
相关推荐
~黄夫人~2 小时前
Ansible 自动化运维:从 “手动输密码” 到 “一键免密管理”
linux·运维·自动化·ansible
cui__OaO2 小时前
Linux驱动--基于驱动设备分离的按键中断驱动
linux·运维·服务器·嵌入式
littlegirll2 小时前
ssh远程调用图形程序
运维·ssh·x11forwarding·远程调用图形界面
星期五不见面2 小时前
虚拟机使用外部WPN网络
linux
OnlyEasyCode3 小时前
Linux下载Navicat、特定版本Mysql
linux·运维·服务器
宇宙帅猴3 小时前
【Ubuntu踩坑及解决方案(一)】
linux·运维·ubuntu·go
济6173 小时前
linux 系统移植(第七期)----U-Boot 图形化配置及其原理-- Ubuntu20.04
linux·运维·服务器
_Xiaosz3 小时前
Photo-SLAM / ORB-SLAM3 编译报错解决:undefined reference to DUtils::Random
linux·ubuntu
kida_yuan3 小时前
【Linux】文件系统与 fsck.ext4 修复 - 我踩过的坑与总结
linux·运维·网络