Linux crontab定时任务不执行原因排查
时间:2026-11-14 07:42 作者:emer 分类: 无
crontab 是 Linux 最常用的定时任务工具,很多人写完任务发现“到点就是不跑”,却不知道问题出在哪。crontab 不执行几乎都可以归为五类:时间格式错、服务没起、环境变量缺、权限或路径错、日志被吞。本文按排查顺序给出可直接照做的命令。
一、先确认 crond 服务在运行
systemctl status crond
如果是 inactive,先启动并设开机自启:
systemctl start crond
systemctl enable crond
部分发行版服务名是 cron(Ubuntu/Debian):
systemctl status cron
二、查看当前用户的定时任务
crontab -l
查看系统级任务:
cat /etc/crontab
ls /etc/cron.d/
注意:crontab -l 看的是当前用户;root 的任务要切到 root 下看,别拿普通用户去核对。
三、时间格式最容易写错
crontab 分五段:分 时 日 月 周,例如每天凌晨 2 点执行:
0 2 * * * /root/backup.sh
常见错误:
- 写成 5 段以外的字段数,直接不执行。
- 分钟位留空或写成 表示每分钟,别和“每天”混淆。
- 想每 5 分钟写 /5,而不是 /5。
四、环境变量与绝对路径
task 运行在极简环境里,PATH 只有 /usr/bin:/bin,脚本里直接写命令名往往找不到。必须用绝对路径:
# 错误:依赖 PATH
* * * * * python3 /root/run.py
# 正确:命令也写绝对路径
* * * * * /usr/bin/python3 /root/run.py
脚本开头显式声明环境:
#!/bin/bash
PATH=/usr/local/sbin:/usr/bin:/bin
export PATH
五、查看 cron 日志定位
# CentOS7
tail -f /var/log/cron
# Ubuntu/Debian
tail -f /var/log/syslog | grep CRON
到点时日志里有没有出现这条任务,是判断“到底有没有被调度”的关键。也可以在任务末尾把输出重定向到文件:
0 2 * * * /root/backup.sh >> /root/backup.log 2>&1
2>&1 把错误输出也收进来,否则报错会被直接吞掉,表面看像没执行。
六、权限与其他拦路虎
- 脚本没有可执行权限:chmod +x /root/backup.sh。
- 脚本本身报错,但没重定向,看不到。
- SELinux 或防火墙拦截脚本里的网络操作。
- 系统时区不对,任务按 UTC 跑,和你以为的北京时间差 8 小时:timedatectl 查看。
- /etc/cron.deny、/etc/cron.allow 把用户禁用了。
常见坑
- 只在命令行手动测试成功,不代表 cron 环境能跑,重点是缺环境变量和绝对路径。
- 改完任务没保存或改错用户,crontab -l 核对不到等于没写。
- 忽略 2>&1,报错被吞,以为“没反应”。
- 时区错位,任务在你睡着时的另一时刻执行。
- 脚本换行要用 LF,Windows 存成 CRLF 会导致执行异常。
总结
排查顺序:crond 是否运行 → crontab -l 核对格式 → 命令与脚本改用绝对路径 → 加 2>&1 重定向看日志 → 检查权限、时区、SELinux。绝大多数“不执行”都卡在环境变量和绝对路径这一步。
遇到问题加QQ23979811 协助处理