Crontab 定时任务不执行,这种情况在实际运维中并不少见。排查起来,通常可以从以下几个关键方向入手,逐一梳理后,基本都能锁定问题根源。

环境变量问题——这是最容易被忽视的陷阱之一。Crontab 在执行任务时加载的环境变量,与你手动在终端执行时完全不同,脚本里依赖的 PATH、HOME 等变量可能根本没有定义。解决方案很直接:在脚本中全部使用绝对路径,同时在 Crontab 文件开头显式声明所需的变量,例如
PATH=/usr/local/bin:/usr/bin。权限问题——脚本本身需要具备可执行权限,并且所属用户必须正确。使用
chmod +x为脚本添加执行权限,同时确认 Crontab 条目对应的用户对脚本所在目录拥有读取权限。脚本错误——脚本本身是否存在语法错误或逻辑缺陷?最简单的验证方式:在终端中手动执行一遍脚本,观察输出是否正常。如果出现报错,先修复脚本,再排查 Crontab 配置。
日志问题——Crontab 默认会将任务输出通过邮件发送,但许多服务器未配置邮件服务,导致输出信息丢失。建议将输出重定向到日志文件,例如
*/5 * * * * /path/to/script.sh >> /var/log/cron.log 2>&1,这样查看日志时一目了然。路径问题——Crontab 中编写的脚本路径或文件路径必须使用绝对路径,避免使用相对路径。因为 Crontab 的工作目录与预期不同,默认是用户的家目录,但实际执行时可能并不在此目录下。
Crontab 语法错误——时间表达式书写错误,例如分钟与小时字段顺序颠倒,或使用了非法字符。可以使用在线 Crontab 语法检查工具进行验证,或者通过
crontab -e编辑时留意是否有报错提示。系统资源问题——CPU、内存或磁盘 I/O 被占满,可能导致系统拒绝分配新任务。使用
top或htop查看资源占用情况,若负载持续过高,优先解决资源瓶颈。Crontab 服务未启动——这是一个基础但容易忽略的点。请检查 cron 服务状态:
systemctl status cron(不同发行版可能是crond)。如果未启动,执行systemctl start cron并设置开机自启。Crontab 文件格式问题——每行定义一个任务,字段之间使用空格或制表符分隔,不能有多余空格,也不能缺失字段。常见的陷阱是注释符号
#没有顶格书写,或者行尾多了一个空格。系统时间问题——服务器时间不准确,会导致任务提前或延后执行。使用
date确认当前时间,再用timedatectl检查时区设置,必要时同步 NTP 服务器。
排查时按照上述顺序逐一检查,大多数问题都能得到解决。记住一个原则:先确保脚本在终端中能够正常运行,再考虑 Crontab 调度环境的差异,这样排查效率最高。
