如果任何查询失败,则停止shell脚本

时间:2012-08-15 22:47:12

标签: linux bash shell unix sunos

下面是我的shell脚本,我试图调用一些正常工作的hive SQL查询。

#!/bin/bash

DATE_YEST_FORMAT1=`perl -e 'use POSIX qw(strftime); print strftime "%Y-%m-%d",localtime(time()- 3600*504);'`
echo $DATE_YEST_FORMAT1

hive -e "
        SELECT t1 [0] AS buyer_id
            ,t1 [1] AS item_id
            ,created_time
        FROM (
            SELECT split(ckey, '\\\\|') AS t1
                ,created_time
            FROM (
                SELECT CONCAT (
                        buyer_id
                        ,'|'
                        ,item_id
                        ) AS ckey
                    ,created_time
                FROM dw_checkout_trans
                WHERE to_date(from_unixtime(cast(UNIX_TIMESTAMP(created_time) AS BIGINT))) = '$DATE_YEST_FORMAT1' distribute BY ckey sort BY ckey
                    ,created_time DESC
                ) a
            WHERE rank(ckey) < 1
            ) X
        ORDER BY buyer_id
            ,created_time DESC;"

sleep 120

QUERY1=`hive -e "
set mapred.job.queue.name=hdmi-technology;
SELECT SUM(total_items_purchased), SUM(total_items_missingormismatch) from lip_data_quality where dt='$DATE_YEST_FORMAT2';"`

问题陈述: -

如果您在hive -e之后看到我的第一个echo $DATE_YEST_FORMAT1阻止。有时该查询由于某些原因而失败。所以目前发生的情况是,如果first Hive SQL query失败,那么在为second Hive SQL query休眠后它会转到120 seconds。这就是我不想要的东西。那么如果first query由于任何原因而失败,有没有办法,那么它应该得到stopped automatically。它应该在几分钟后从启动开始自动运行(应该可配置

更新: -

正如Stephen所建议的那样。

我尝试过这样的事情 -

#!/bin/bash

hive -e " blaah blaah;"

RET_VAL=$?
echo $RET_VAL
if [ $RET_VAL -ne 0]; then
echo "HiveQL failed due to certain reason" | mailx -s "LIP Query Failed" -r rj@host.com rj@host.com
exit(1)

我在下面输入的内容是错误的,我也没有收到任何电子邮件。我的语法和方法有什么问题吗?

syntax error at line 152: `exit' unexpected

注意: -

如果成功执行Hive查询,则零成功。

放置空格后的另一个更新: - 在进行如下更改后

#!/bin/bash

hive -e " blaah blaah;"

RET_VAL=$?
echo $RET_VAL
if [ $RET_VAL -ne 0 ]; then
echo "HiveQL failed due to certain reason for LIP" | mailx -s "LIP Query Failed" -r rj@host.com rj@host.com
fi
exit

hive -e 'Another SQL Query;'

我有类似下面的内容 -

RET_VAL=0
+ echo 0
0
+ [ 0 -ne 0 ]
+ exit

状态代码为zero,因为我的第一个查询成功但我的程序在此之后退出并且它没有执行我的第二个查询?为什么?我在这里肯定会遗漏一些东西。

2 个答案:

答案 0 :(得分:2)

您也可以找到有用的设置立即退出选项:

     set  -e      Exit immediately if a simple command (see SHELL  GRAMMAR
                  above) exits with a non-zero status.  The shell does not
                  exit if the command that fails is part  of  the  command
                  list  immediately  following  a  while or until keyword,
                  part of the test in an if statement, part of a && or  ||
                  list, or if the command's return value is being inverted
                  via !.  A trap on ERR, if set, is  executed  before  the
                  shell exits.

如本例所示

#!/bin/bash

set -e
false
echo "Never reached"

答案 1 :(得分:1)

除非我误解了这种情况,否则很简单:

#!/bin/bash

DATE_YEST_FORMAT1=`perl -e 'use POSIX qw(strftime); print strftime "%Y-%m-%d",localtime(time()- 3600*504);'`
echo $DATE_YEST_FORMAT1

QUERY0="
        SELECT t1 [0] AS buyer_id
            ,t1 [1] AS item_id
            ,created_time
        FROM (
            SELECT split(ckey, '\\\\|') AS t1
                ,created_time
            FROM (
                SELECT CONCAT (
                        buyer_id
                        ,'|'
                        ,item_id
                        ) AS ckey
                    ,created_time
                FROM dw_checkout_trans
                WHERE to_date(from_unixtime(cast(UNIX_TIMESTAMP(created_time) AS BIGINT))) = '$DATE_YEST_FORMAT1' distribute BY ckey sort BY ckey
                    ,created_time DESC
                ) a
            WHERE rank(ckey) < 1
            ) X
        ORDER BY buyer_id
            ,created_time DESC;"

if hive -e "$QUERY0"
then
    sleep 120
    QUERY1=`hive -e "
    set mapred.job.queue.name=hdmi-technology;
    SELECT SUM(total_items_purchased), SUM(total_items_missingormismatch) from lip_data_quality where dt='$DATE_YEST_FORMAT2';"`
    # ...and whatever you do with $QUERY1...
fi

字符串$QUERY0是为了方便,而不是必需品。关键是您可以使用if语句测试命令是否成功(返回状态0)。 test命令(更好地称为[)只是一个在满足测试条件时返回0的命令,在不满足时返回1(非零)。

因此,if语句运行第一个hive查询;如果它通过(退出状态0),那么(并且只有那时)它会转到then子句中的动作。

我抵制了重新格式化SQL的诱惑;足以说明,这不是我在自己的代码中使用的布局。