crontab任务不执行的首要原因是crond服务未运行,其次为语法错误、环境变量缺失、路径不正确、权限不足、日志未重定向、PAM访问限制及特殊字符未转义;需按服务状态→语法→环境→权限→日志顺序排查。

crontab 任务不执行,通常不是脚本写错了,而是环境、权限或配置细节没对上。快速定位的关键是按顺序验证几个核心环节。
确认 crond 服务是否在运行
所有定时任务都依赖后台服务。服务没起来,再正确的配置也无效。
- 查看状态:
sudo systemctl status crond(CentOS/RHEL)或sudo systemctl status cron(Ubuntu/Debian) - 若显示 inactive,启动它:
sudo systemctl start crond(或cron) - 设为开机自启:
sudo systemctl enable crond
检查任务是否真正写入且语法正确
用 crontab -e 编辑后,容易因编辑器误操作(比如 vi 中按了 :q 而非 :wq)导致未保存;也常因格式错误被整行跳过。
- 用
crontab -l确认内容已生效 - 核对时间字段顺序:分、时、日、月、周 —— 比如
0 2 * * 1表示每周一凌晨 2 点 - 避免行尾空格或把
#写在时间字段后面(#后全部视为注释) - 用 crontab.guru 验证表达式含义
重点排查环境与路径问题
这是 90% 失败任务的根源。cron 使用极简 shell(通常是 /bin/sh),PATH 很窄,也不加载你的 .bashrc 或 .profile。
- 脚本中所有命令尽量用绝对路径,例如
/usr/bin/python3而非python3;可用which python3查路径 - 在 crontab 文件开头显式声明环境变量:
PATH=/usr/local/bin:/usr/bin:/bin<br>SHELL=/bin/bash<br>HOME=/home/username
- 脚本第一行加
#!/bin/bash,开头切换工作目录:cd "$(dirname "$0")" || exit 1,避免相对路径失效
看日志 + 加输出重定向
没有日志,就像蒙眼排错。别只靠“好像没动”,要看到实际发生了什么。
- 给任务加日志输出:
0 3 * * * /path/to/script.sh >> /tmp/script.log 2>&1 - 查系统级 cron 日志:
Ubuntu/Debian:sudo grep CRON /var/log/syslog
CentOS/RHEL:sudo journalctl -u crond -n 50 --no-pager - 注意:失败时 cron 默认发邮件到
/var/spool/mail/$USER,但邮件服务可能未启用,优先依赖重定向日志


















