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

