先说现象
升级到青龙面板 v2.21.0 之后,跑任何脚本,日志尾部都会多出这样的东西:
## 开始执行... 2026-09-21 09:51:08
...
jwt malformed
## 完成 ✅... 2026-09-21 09:51:09 耗时
状态更新失败(Validation failed)
脚本本身跑完了,业务逻辑也没问题。但面板上的任务状态永远停在「运行中」,得手动去点停止。日志里既报 Validation failed 又报 jwt malformed,看着像两个毛病,实际上你面对的是三个。
这篇记录把三层错因一层层剥开,每层都给可复现的验证命令和最小改动的修复方案。
一键修复
把文末的脚本存成 ql-fix-all.sh,丢进容器执行:
docker cp ql-fix-all.sh qinglong:/tmp/
docker exec qinglong bash /tmp/ql-fix-all.sh容器名用 docker ps 查,按实际的改。已经在容器里的话直接 bash ql-fix-all.sh。
脚本自动备份、改完做语法校验、失败自动回滚,重复跑也没副作用。另有两个开关:
bash ql-fix-all.sh -n # 只看诊断,不改文件
bash ql-fix-all.sh --revert # 还原跑完去面板随便跑一个任务,日志结尾只剩 ## 完成 ✅ 这一行,状态能变回「已结束」,就是好了。
不想用脚本也行,下面三个改动手工做一样的效果。
两个必须知道的点
改完那一次运行,日志里还会再报一次同样的错。 因为 shell 是在任务启动时才 source api.sh 的,你改文件的时候,那个任务早就把旧函数读进内存了。它会带着旧函数收尾,所以再刷一次 404。这是正常的「最后一响」,从下一个任务起才干净,不是补丁没生效。
全程不用重启面板。 三处改动都是改文件或改缓存,立即生效。重启面板反而会杀掉正在运行的任务进程,让任务又一次卡在「运行中」——等于自己把刚修好的问题重新制造一遍。
根治
这些都是壳补丁,是在不想重建容器的前提下最轻的止血办法。真正的根治只有一条:把后端/镜像更新到与 shell/*.sh 同版本。升级之后记得把补丁撤掉:
评论 (0)