目录
[二、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 - 遇到问题先看日志,再手动测试脚本