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

如何在shell脚本中检测psql执行SQL的事务是否中止并获取返回码

可行解决方案

写法1(最简洁,直接判断命令退出状态)

直接把psql命令放在if的判断条件中,shell会自动识别命令的退出码,0进入成功分支,非0进入失败分支:

echo 'Deploying SQL'
if psql --quiet --single-transaction --file=myfile.sql; then
    echo 'successful'
else
    # 此处编写你的自定义错误处理逻辑
    echo "SQL事务执行失败,退出码:$?" >&2
    # 示例:写入错误日志
    echo "$(date '+%Y-%m-%d %H:%M:%S') 执行myfile.sql事务失败" >> /data/log/sql_deploy_err.log
    # 示例:触发告警通知(可替换为你的告警脚本)
    # sh /path/to/alert.sh "SQL部署失败"
    exit 1
fi

写法2(需单独存储退出码做差异化处理)

如果需要根据不同的退出码执行不同逻辑,可以先把退出码存入变量再判断:

echo 'Deploying SQL'
psql --quiet --single-transaction --file=myfile.sql
# $? 是shell内置变量,代表上一条命令的退出状态,此处存入变量方便后续使用
psql_code=$?

if [[ $psql_code -eq 0 ]]; then
    echo 'successful'
else
    echo "SQL执行失败,错误码:$psql_code" >&2
    # 可根据psql_code的不同值做不同处理,比如退出码为1是致命错误、2是连接错误等,对应不同的告警级别
    exit $psql_code
fi

注意事项

  • 你原来的写法存在语法问题:shell中变量赋值不能加空格,local关键字只能在函数内部使用,直接给变量赋值命令只会拿到命令的标准输出内容,不会拿到退出码
  • --single-transaction参数已经保证单事务运行,只要psql返回非0退出码,整个事务已经自动回滚,不需要额外处理回滚逻辑
  • 错误输出加>&2是为了将日志输出到标准错误流,方便cron任务统一收集错误日志
  • 不要在脚本开头开启全局set -e配置,否则psql执行失败时脚本会直接退出,不会进入你的自定义错误处理分支

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:03