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
  • 遇到问题先看日志,再手动测试脚本
相关推荐
你好潘先生10 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
orion5721 小时前
Missing Semester Class1:course overview and introduction of shell
linux
SkyWalking中文站1 天前
认识 Horizon UI · 6/17:Trace 探索器
运维·监控·自动化运维
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
程序员老赵1 天前
服务器文件不想 SFTP 上传?Docker 跑个 File Browser,浏览器就能管理
服务器·docker·开源
火车叼位1 天前
写给初级开发者:SSL、SSH、HTTPS 与证书体系全解析
运维
vivo互联网技术1 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
用户805533698031 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式
用户805533698031 天前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式