Python检测Vaultwarden版本更新后调用bash脚本未执行问题求助
问题排查与修复方案
核心问题1:文件未释放导致执行报错
你当前将subprocess.call的调用逻辑写在了操作vaultwarden-update的with open代码块内部,此时Python仍持有该文件的写锁没有释放,系统会判定文件处于占用状态,因此触发sh text file busy错误,也会导致bash脚本无法正常执行。
核心问题2:subprocess调用参数不规范
你使用的subprocess.call([vcommand], shell=True)属于错误用法:当shell=True时需要传入字符串格式的命令,当shell=False时才需要传入拆分后的命令列表。两种写法混用会导致命令解析异常,无法触发脚本执行。
修正后的代码片段
仅需要调整if判断内的逻辑即可:
# Check who is higher if LooseVersion(vwgithub_version) == LooseVersion(vw_file_version): # 先完成文件写入,with块结束后自动关闭文件、释放句柄 with open('vaultwarden-update', 'w') as vaultwarden: vw_new_file_content = vw_file_content.replace(vw_file_match.group(1), f'dockerversion={vwgithub_version}') vaultwarden.write(vw_new_file_content) # 文件释放后再执行脚本,使用规范的列表传参+shell=False subprocess.call(['bash', 'vaultwarden-update'], shell=False)
额外排查建议
- 如果Python脚本的工作目录和
vaultwarden-update脚本存放目录不一致,建议使用绝对路径指定脚本位置,避免出现找不到文件的问题。 - 调试阶段可以将
subprocess.call替换为subprocess.run(..., capture_output=True, text=True),打印返回的stderr内容可以快速定位其他执行异常。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

