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
相关产品推荐
相关产品推荐

