You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bitbucket Pipeline执行psql迁移脚本时在简单查询阶段挂起

Bitbucket Pipeline执行psql迁移挂起问题解决

问题现象

通过Bitbucket Pipeline的atlassian/ssh-run管道执行psql迁移脚本时,进程在执行SELECT pg_catalog.set_config('search_path', '', false);后挂起,后续的echo test未执行,输出停留在:

SET
SET
SET
SET
SET
=
 set_config 
------------
 
(1 row)

可能原因及修复方案

1. psql交互模式/终端缓冲问题

psql在非交互式环境下可能因终端设置或输出缓冲导致进程挂起,添加非交互参数解决:
修改Pipeline中的COMMAND为:

sudo su - postgres -c "psql -X -q -d test -f /tmp/test.sql && echo test"
  • -X:跳过读取psql配置文件,避免意外交互
  • -q:静默执行,减少输出缓冲干扰

2. 输出缓冲阻塞

ssh管道可能因psql的输出缓冲导致进程挂起,强制刷新输出:

sudo su - postgres -c "psql -d test -f /tmp/test.sql 2>&1 | cat && echo test"

如果服务器安装了expect包,也可以用unbuffer禁用缓冲:

sudo su - postgres -c "unbuffer psql -d test -f /tmp/test.sql && echo test"

3. psql未主动退出

脚本执行完成后psql可能未自动退出,在迁移脚本末尾添加强制退出命令:

\q

4. 命令引号/执行逻辑问题

调整COMMAND的执行逻辑,确保即使psql出错也能输出标记,方便排查:

COMMAND: 'sudo su - postgres -c "psql -d test -f /tmp/test.sql; echo test"'

将&&替换为;,确保echo test总会执行,判断是psql执行失败还是真的挂起。

排查建议

  • 直接在目标服务器上手动执行psql命令,确认脚本本身是否能正常完成
  • 查看postgres服务器日志,检查是否有锁等待、权限或语法错误
  • 关闭DEBUG模式,避免日志输出干扰管道的输出处理

内容的提问来源于stack exchange,提问作者Karen Kostanyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:23:11