RHCE--Linux循环执行的例行性任务:crontab从入门到精通

目录

前言:为什么要学循环执行的例行性任务?

一、什么是循环执行的例行性任务?

[二、crontab 基础格式:时间字段怎么写?](#二、crontab 基础格式:时间字段怎么写?)

[三、用户级 vs 系统级 crontab](#三、用户级 vs 系统级 crontab)

[1. 用户级 crontab](#1. 用户级 crontab)

[2. 系统级 crontab](#2. 系统级 crontab)

四、避坑指南:新手最容易踩的坑

五、示例

[六、如何排查 crontab 不执行?](#六、如何排查 crontab 不执行?)

[第一步:先确认 crond 服务状态](#第一步:先确认 crond 服务状态)

[第二步:查看 crontab 执行日志](#第二步:查看 crontab 执行日志)

第三步:手动执行脚本,验证脚本本身

第四步:检查脚本权限与用户身份

[第五步:检查环境变量(PATH / 特殊符号)](#第五步:检查环境变量(PATH / 特殊符号))

第六步:验证时间格式是否正确

七、总结


前言:为什么要学循环执行的例行性任务?

作为一名 Linux 运维 / 开发,你一定遇到过这些场景:

  • 每天凌晨 2 点备份数据库,不想熬夜守着服务器执行命令;
  • 每小时清理一次临时文件,防止磁盘被日志占满;
  • 每周一自动生成服务器监控报表,发送到运维群;
  • 每月 1 号自动清理上个月的过期日志,避免手动操作遗漏。

这些周期性、重复性的工作 ,都可以通过 Linux 系统自带的「例行性工作调度」功能实现,核心工具就是 crontab

crontab 是 Linux 系统中最经典、最通用的定时任务工具,从 CentOS 5 到 CentOS Stream 9,几乎所有发行版都默认自带。它的核心优势就是:一次配置,永久生效,无需人工干预,是自动化运维的基础技能之一。

本文会从基础概念、语法格式、用户 / 系统级任务、避坑指南、实战示例、排错方法等多个维度,带你彻底吃透 crontab

一、什么是循环执行的例行性任务?

简单说,就是让 Linux 系统在指定时间、周期性自动执行任务。比如:

  • 每天凌晨备份日志
  • 每小时清理临时文件
  • 每周自动重启服务

crontab 就是 Linux 中实现这一功能的核心工具,分为用户级系统级两种。

二、crontab 基础格式:时间字段怎么写?

crontab 的语法是固定的

写入的命令格式:每一行书写一个工作,每个工作共有6个字段

bash 复制代码
分  时  日  月  周  命令/脚本

特殊符号含义:

  • *:任意值
  • ,:多个值,如 1,3,5
  • -:范围,如 1-5
  • /:间隔,如 */2 表示每隔 2 个单位,如:隔一天执行一次 * * */2 * *

三、用户级 vs 系统级 crontab

1. 用户级 crontab

  • 每个用户都有自己的任务列表
  • 适合普通用户执行自己的脚本
  • 执行crontab 命令就是在修改 /var/spool/cron 中的定时任务文件

cat /var/log/cron(查看日志)

2. 系统级 crontab

  • crond 服务除了会在工作时查看 /var/spool/cron 文件夹下的定时任务文件以外,还会查看 /etc/cron.d 目录。而在 /etc/anacrontab 文件里面存放每天、每周、每月需要执行的系统任务。

    root@hahaha \~\] # ls -l /etc/ \| grep cron\* cron.d # 系统定时任务 cron.daily # 每天的任务 cront.deny # 定时任务黑名单 cron.hourly # 每小时执行的任务 cron.monthly # 每月的定时任务 crontab # 定义任务管理文件 cron.weekly # 每周的定时任务

  • crontab -e 是每个用户都可以执行的命令,但有时定时任务必须由系统执行,此时就需要编辑/etc/crontab配置文件来实现

    vim /etc/crontab

**- 仅能通过root定义,不可以使用普通账户身份去执行计划任务

  • 方法:在/etc/crontab 最后一行新增计划任务即可**
  • 必须指定执行用户,格式:分 时 日 月 周 用户 命令
  • 适合执行系统级任务(如备份、日志轮转)
  • 配置会自动被 crond 服务读取,无需重启

四、避坑指南:新手最容易踩的坑

1. 命令找不到:绝对路径问题

crontab 的默认 PATH 非常短,很多命令找不到。

✅ 解决方法:

  • 直接用绝对路径:/bin/date/usr/bin/ls
  • 或者在 /etc/crontab 开头加上你终端里的 PATH

2. 时间格式写错:整点必须写 0 分

例如:每天早上六点执行命令

❌ 错误:* 6 * * *(6 点的每一分钟都执行)

✅ 正确:0 6 * * *(每天 6 点整执行)

五、示例

bash 复制代码
# 每分钟执行一次
* * * * * /root/test.sh

# 每天凌晨3点半执行
30 3 * * * /root/backup.sh

# 每隔6小时执行一次
0 */6 * * * /root/clean.sh

# 每周一到周五8点执行
0 8 * * 1-5 /root/report.sh

# 每天晚上9点半重启nginx
30 21 * * * root systemctl restart nginx

六、如何排查 crontab 不执行?

第一步:先确认 crond 服务状态

bash 复制代码
# 检查服务是否运行
systemctl status crond
# 没运行就启动并设置开机自启
systemctl start crond
systemctl enable crond
  • 服务没启动,所有任务都不会执行,这是最基础的一步。

第二步:查看 crontab 执行日志

日志路径:/var/log/cron

bash 复制代码
# 实时查看日志,过滤你的任务关键词
tail -f /var/log/cron | grep "你的任务名/脚本名"

日志里能直接看到:

  • 任务是否被调度(CMD (/root/test.sh) 表示已执行)
  • 报错原因(command not found/permission denied/ 语法错误)

第三步:手动执行脚本,验证脚本本身

直接在终端里以相同用户执行脚本:

bash 复制代码
# 如果是root用户的任务
/root/test.sh
# 如果是普通用户的任务
su - 用户名 -c "/path/to/script.sh"
  • 手动执行报错,说明脚本本身有问题(比如依赖缺失、路径错误、语法错误),先修复脚本。

第四步:检查脚本权限与用户身份

  • 脚本必须有执行权限:chmod +x /root/test.sh
  • 系统级任务要确认执行用户(比如 root)是否有权限读写文件 / 执行命令
  • 避免用普通用户执行需要 root 权限的操作(比如 systemctl restart nginx)

第五步:检查环境变量(PATH / 特殊符号)

  • 命令找不到:检查 PATH 是否包含命令所在目录,或直接用绝对路径
  • 日期 / 日志文件没生成:检查 % 是否转义(date +%Y-%m-%d)
  • 脚本内路径错误:脚本里的文件路径尽量用绝对路径(比如 /var/log/xxx.log,不要写 xxx.log)

第六步:验证时间格式是否正确

  • 整点任务必须写 0 6 * * *,不是 * 6 * * *
  • 周和日同时设置时,crontab 是「或」逻辑,不是「且」,需要用脚本判断
  • 区间 + 间隔不会跨天,比如 10-23/2 不会执行 23 点,也不会顺延到次日

七、总结

crontab 是 Linux 运维的基础技能,掌握它能帮你自动化很多重复工作。记住三个核心要点:

  • 时间格式不能错,整点必须写 0
  • 命令尽量用绝对路径,或者配置 PATH
  • 遇到问题先看日志,再手动测试脚本
相关推荐
半壶清水4 小时前
用P4 Tutorial、BMv2 和 Mininet‌解析网络第一集------模拟环境搭建
运维·服务器·网络·网络协议·tcp/ip
木欣欣粉皮4 小时前
解决Ubuntu 26.04的挂起状态唤醒问题
linux·运维·ubuntu
ambition202424 小时前
UNIX消息队列:从理论模型到工程实现的演进
linux·服务器·unix
阿正的梦工坊4 小时前
【Typescript】08-keyof-typeof-索引访问类型
linux·ubuntu·typescript
高翔·权衡之境4 小时前
主题10:实时性——硬实时与软实时
服务器·网络·驱动开发·信息与通信·智能硬件
云商直通车5 小时前
华为云ECS购买与配置超详细教程
服务器·数据库·华为云
zhojiew5 小时前
使用Redis Stream订阅HUATUO发布SSE内核可观测性事件并进行AI分析的数据管道实践
运维·hbase·aws
轩Scott5 小时前
Ubuntu开机卡Logo?NVIDIA驱动修复全攻略
linux·ubuntu
Gauss松鼠会5 小时前
GaussDB(DWS) 日常维护命令
服务器·数据库·postgresql·性能优化·gaussdb·经验总结