宝塔计划任务不执行的最常见原因是系统级crond服务未运行;需先检查并启动crond/cron服务,再确保脚本使用绝对路径、正确权限、unix换行符及完整环境模拟。

crond 服务根本没在运行
宝塔计划任务不执行,最常见原因是系统级 crond 服务压根没启动——不是“不准时”,是“完全不触发”。面板上显示“已启用”毫无意义,因为底层守护进程没在监听。
直接执行:systemctl status crond(CentOS/RHEL/AlmaLinux)或 systemctl status cron(Debian/Ubuntu)。如果看到 inactive (dead) 或 Unit not found,说明服务未安装或已停止。
- 未安装:CentOS 系统用
dnf install cronie,Debian/Ubuntu 用apt install cron - 已安装但停着:运行
systemctl start crond(或cron),再加systemctl enable crond防止重启后失效 - 宝塔本身不用重启,但已有任务要等下一个周期,或手动点“立即执行”验证
脚本路径对了,但 crond 找不到命令
你在宝塔里填的 /www/wwwroot/site/cron.sh 能点“立即执行”成功,不代表 crond 能跑通。它以 root 用户运行,环境极简:$PATH 只有 /usr/bin:/bin,不读 ~/.bashrc,~ 不展开,env 命令甚至可能不存在。
典型报错:/bin/sh: php: not found 或 No such file or directory(实际是解释器路径末尾多了 \r)。
- 所有命令必须用绝对路径:比如
/www/server/php/82/bin/php /www/wwwroot/site/cron.php - Shell 脚本第一行必须是
#!/bin/bash,不能写#!/usr/bin/env bash - 脚本开头加
cd /www/wwwroot/site切工作目录,别依赖相对路径读配置文件 - 上传前确认换行符是
LF(非CRLF),VS Code 里看右下角,Sublime 里选 “Line Endings → Unix”
权限和用户身份不匹配
宝塔默认用 www 用户执行任务(非你 SSH 登录的用户),所以 chmod +x 只是第一步,还得确保 www 用户对脚本、脚本里调用的二进制、以及目标目录都有读+执行权限。
常见静默失败现象:日志为空、只显示“执行成功”、但数据库没备份、文件没生成。
- 给脚本设
chmod 755 /path/to/script.sh,同时检查它调用的其他脚本或工具是否也具备对应权限 - 执行
sudo -u www /bin/bash -c 'whoami && pwd && /path/to/script.sh'模拟真实执行环境 - 如果脚本里用了 Python 虚拟环境,别写
python,改用/path/to/venv/bin/python - 关键输出务必重定向到文件:
/bin/bash /path/to/script.sh >> /tmp/cron_debug.log 2>&1,然后tail -f /tmp/cron_debug.log实时看
别只信宝塔任务日志
宝塔的 /www/wwwlogs/cron.log 只记录自己“下发动作”,不反映 crond 是否真调用了你的命令、返回码是多少、stderr 输出了什么。真正出问题的地方,往往藏在系统日志里。
执行 tail -f /var/log/cron,能看到类似这样的原始记录:(root) CMD (/www/wwwroot/site/cron.sh)。如果这行之后没输出,大概率是脚本崩溃、权限拒绝,或者被 set -e 中断但没打日志。
- 先确认系统开启了 cron 日志:检查
/etc/rsyslog.conf是否有cron.*相关配置,没有就加上并systemctl restart rsyslog - 宝塔日志只存最近 10 条、每条最多 2000 字符,长输出会被截断——别全信它显示的内容
- 脚本末尾加
exit 0,避免最后一条命令失败导致整个任务返回非零退出码,让宝塔误判为失败
crond 启动时不会校验你写的脚本语法是否合法,也不会提示 php 版本不兼容、Python 模块缺失、或 mysql 客户端不在 PATH 里——它只管调用,调用失败就沉默。验证必须绕过宝塔,直连系统级日志和模拟执行环境。











