在远程服务器上运行时无法获取psql错误

时间:2017-01-16 17:04:16

标签: bash psql

我写了一个bash脚本来在远程服务器上运行psql scrips。基本上我使用的命令是:

psql --out test.log -h HOST_IP_ADDRESS -U USER_NAME -d DATABASE -f SQL_FILE

该命令运行正常,但是当我模拟错误以便测试它时,即使我在shell中看到错误,也无法收到错误消息,如下所示

psql:SQL_FILE.sql:71: ERROR:  relation "TABLE_NAME" does not exist

我已经尝试过了:

  1. 使用-o output_file但会生成空文件
  2. 使用var=$(psql command)但var返回空
  3. psql command > file.log但错误不在生成的文件中。
  4. 知道如何解决这个问题?

    由于

3 个答案:

答案 0 :(得分:1)

失败的命令通常会生成返回码。您可以在执行命令后立即使用$?特殊变量获取此返回码。例如,您可以这样做:

psql ARGUMENT LIST
result=$?

if
  [ $result = 0 ]
then
  echo "Success"
else
  echo "Failure with error code $result"
fi

返回代码通常应该是命令成功或失败的最可靠指示。

命令也可以在两个标准输出通道中的任何一个上发送消息:标准输出(stdout)和标准错误(stderr)。两者通常都出现在您的终端上,但它们实际上是分开的,如果您愿意,可以单独处理。

您可以使用命令替换来收集stderr,stdout或两者:

stdout_messages="$(command and args 2>/dev/null)"
stderr_messages="$(command and args 2>&1 1>/dev/null)"
all_messages="$(command and args 2>&1)"

这些命令具有X>/dev/null之类的重定向,以避免显示未收集的按摩,但您可以删除它们以在终端上查看它们。

stderr上存在任何消息并不表示命令已失败,因为许多程序可能使用stderr来处理状态消息或非致命错误。除非您有特殊需要,否则应使用命令替换来收集消息,而不是确定命令是否失败。

您可以通过收集邮件,然后使用$?确定状态来组合这两种机制。

答案 1 :(得分:0)

尝试

psql command 2> errors.log

2表示“重定向文件描述符2”,这是标准错误。这会将错误保存到名为errors.log的文件中。

将错误输入变量:

var=$(psql command 2>&1)
echo "$var"

这里我们将标准错误(2)重定向到文件描述符1(标准输出)。

您可能尝试在此处使用旧的过时反引号字符,但`是此网站上的格式字符$(...)是首选。

答案 2 :(得分:0)

我不知道psql,但如果您的问题与远程执行的操作有关,您可以做的一件事是使用ssh连接到远程主机并在那里执行命令,就像它是本地。然后ssh将转发返回码。

看起来像这样:

ssh user@remote_host psql ARGUMENT LIST

您将从命令中删除与远程执行有关的任何内容,因为它将在本地执行。