Bash vsql错误处理(无此类文件或目录)
我正在使用shell脚本将查询结果上载到数据库。在脚本中,首先将查询结果保存到csv文件中,然后将该文件上载到另一个数据库中。在每一步之后,我都会向用户发送一封通知电子邮件。我面临的问题是,我无法进行正确的错误处理。例如,我使用如下命令生成csv文件:Bash vsql错误处理(无此类文件或目录),bash,shell,vertica,vsql,Bash,Shell,Vertica,Vsql,我正在使用shell脚本将查询结果上载到数据库。在脚本中,首先将查询结果保存到csv文件中,然后将该文件上载到另一个数据库中。在每一步之后,我都会向用户发送一封通知电子邮件。我面临的问题是,我无法进行正确的错误处理。例如,我使用如下命令生成csv文件: /apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -o "/data/test.csv" -c "select count(*), month f
/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -o "/data/test.csv" -c "select count(*), month from table1 group by month"
如果目录“data”不存在,Unix中的退出状态仍然返回0(即使发生错误,操作仍成功),因为查询结果显示在屏幕上。我如何处理这种错误?我应该在脚本中使用什么样的IF语句来捕获它
非常感谢 使用
mkdir-p/data
在查询之前确保目录存在。这是一个棘手的问题
Verticavsql
有一个变量,ON\u ERROR\u STOP
,如果设置该变量,将停止脚本并返回3的错误代码
\set ON_ERROR_STOP on
也就是说,使用-o选项似乎不会触发这种行为,因为错误不在SQL端
我的建议是作弊,重定向输出,而不是要求Vertica这样做:
/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv
请注意-F和-A选项以创建类似csv的输出。您可能希望-q(quiet)也只有查询输出,没有消息
然后,如果目标文件不存在,则您确实具有bash非空退出状态:
[me@server ~]$/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv
-bash: /data/test.csv: No such file or directory
[me@server ~]$ echo $?
1
从那时起,检查返回代码就足够容易了,可以捕获bash和Vertica
# your vsql command....
STATUS=$?
if [[ $STATUS -gt 0 ]]
then
echo oops
exit
fi
如果您有很多这样的问题,您甚至可能会创建一个函数,将查询和输出文件作为参数。我有类似的问题,并找到了一种简单的方法来解决它。我注意到,当查询失败时,结果csv文件大小实际上变为0。您可以检查csv文件大小是否为0 vsql -c "your queries command" -o "/location/of/results" if [[ -s "/location/of/results" ]]; then some_other_command fi vsql-c“您的查询命令”-o“/location/of/results” 如果[[-s”/location/of/results“];然后 其他命令 fi
此外,如果您收到此错误:
error 5286:Unsupported设置选项ON\u error\u STOP
您可以使用
vsql
选项:vsql-v ON\u ERROR\u STOP=ON
是的,但我的问题更多的是关于如何正确处理错误以及vsql是否将任何消息传递到Unix。可能还有其他一些错误,我想知道如何管理它们。您可以根据vsql
的输出来管理这些错误。使用output=$(您的命令)
捕获vhost
的输出。然后,$output将成为查询结果。它如何帮助错误处理?这对您有用吗?我已经设置了此选项,但它仍然无法捕获错误