宝塔定时任务静默失败主因是执行环境差异:www 用户权限不足、/bin/sh 解析脚本、PATH 缺失、日志截断及 Python 虚拟环境未激活。需设 755 权限、#!/bin/bash、绝对路径、显式 PATH、重定向日志并验证模块。

宝塔定时任务不执行:sh 脚本权限被忽略
脚本在终端能跑,放进宝塔定时任务就静默失败,大概率是权限没设对。宝塔用的是 www 用户执行任务,不是你登录时的用户,所以 chmod +x 之后还得确认该用户有读 + 执行权限。
-
chmod 755 /path/to/script.sh是基础,但不够——如果脚本里调用了其他脚本或二进制文件(比如php、curl),它们也得在www用户 PATH 里,或写绝对路径 - 别用
~/或$HOME,宝塔执行时没有用户环境变量,~会变成空或指向/www,直接报No such file or directory - 临时加一句
whoami && pwd到脚本开头,能快速确认执行身份和当前工作目录
宝塔定时任务不执行:cron 执行路径和 Shell 环境不一致
宝塔底层走的是系统 cron,但它的默认 SHELL 是 /bin/sh,不是你常用的 /bin/bash。很多语法(比如 [[]]、source ~/.bashrc、数组)在 sh 下直接报错,且不提示。
- 脚本第一行必须写
#!/bin/bash,否则即使你本地用 bash 写的,cron 也会按 sh 解析 - 不要依赖
.bashrc或.profile里的环境变量(比如PATH、PHP_INI_SCAN_DIR),cron 不加载这些;要么在脚本里显式export PATH="/www/server/php/82/bin:$PATH",要么所有命令写绝对路径(如/www/server/php/82/bin/php) - 遇到“command not found”,先看是不是
php、node这类命令没在/bin/sh的默认 PATH 里
宝塔面板里“任务日志”为空或只显示“执行成功”但没效果
这是最误导人的地方:宝塔把 cron 返回码为 0 就标成“执行成功”,哪怕脚本中途崩溃、输出被重定向丢弃、或者只写了 echo 没实际动作,它都看不见。
- 务必在脚本末尾加
exit 0,否则最后一条命令失败会导致整个任务返回非零码,宝塔可能不记录日志 - 把关键输出重定向到文件,比如
/bin/bash /path/to/script.sh >> /tmp/cron_debug.log 2>&1,然后手动tail -f /tmp/cron_debug.log查实时行为 - 宝塔“任务日志”只存最近 10 条,且每条只截取前 2000 字符,长日志会被砍掉——别全信它显示的内容
Python 脚本在宝塔定时任务中 import 失败或找不到模块
不是 Python 没装,是 cron 启动的 Python 解释器没加载你的虚拟环境或 pip 安装路径。
- 别写
python script.py,改用绝对路径,比如/www/server/python/bin/python3.9 /path/to/script.py - 如果用了 venv,必须先激活再运行:
/path/to/venv/bin/python /path/to/script.py,不能靠source activate——source在sh里根本不可用 -
import requests报错?先确认这个 Python 环境里真装了:/path/to/python -m pip list | grep requests,别假设全局 pip 和 cron 用的是同一个