Shell 如果配置单元失败,请停止Bash脚本

Shell 如果配置单元失败,请停止Bash脚本,shell,hadoop,hive,Shell,Hadoop,Hive,我有一个bash脚本,它在文件夹中循环并处理所有*.hql文件。有时一个配置单元脚本失败(语法、资源约束等),而不是脚本失败,它将继续到下一个.hql文件 无论如何,我可以阻止bash处理剩余的?下面是我的示例bash: for i in `ls ${layer}/*.hql`; do echo "Processing $i ..." hive ${hiveconf_all} -hiveconf DATE=${date} -f ${i} & if [ $j

我有一个bash脚本,它在文件夹中循环并处理所有*.hql文件。有时一个配置单元脚本失败(语法、资源约束等),而不是脚本失败,它将继续到下一个.hql文件

无论如何,我可以阻止bash处理剩余的?下面是我的示例bash:

for i in `ls ${layer}/*.hql`; do
      echo "Processing $i ..."
      hive ${hiveconf_all} -hiveconf DATE=${date} -f ${i} &
    if [ $j -le 5 ]; then
       j=$(( j+1 ))
    else
      wait
      j=0
    fi
  done

我将检查前一个命令的进程完成状态,并调用exit命令以退出循环

 (( $? == 0 )) && exit 1
在hive命令后引入上面的一行,这样做应该是正确的。

add

set -e

在脚本顶部

使用此模板运行并行进程并等待其完成。添加您的
日期
hiveconf\u所有
和其他变量:

#!/bin/bash
set -e

#Run parallel processes and write their logs
log_dir=/tmp/my_script_logs
for i in `ls ${layer}/*.hql`; do
      echo "Processing $i ..."
      #Run hive in parallel and redirect to the log file
      hive ${hiveconf_all} -hiveconf DATE=${date} -f ${i} 2>&1 | tee "log_dir/${i}".log &
done

#Now wait for all processes to complete
FAILED=0

for job in `jobs -p`
do
   echo "job=$job"
   wait $job || let "FAILED+=1"
done

if [ "$FAILED" != "0" ]; then
    echo "Execution FAILED!  ($FAILED)"
    #Do something here, log or send message, etc
    exit 1
fi

#All processes are completed successfully!
#Do something here
echo "Done successfully"

然后,您将能够单独检查每个进程日志。

您的意思是,当五个并发进程中的一个失败时,您希望停止,对吗?因为您有意一次启动多个。无论如何我不确定这样做是否可以获得进程的退出状态。您可能需要单独等待每一个,以获得我认为的结果(或者根本不在后台运行它们)。是的,好的一点,是否有一种方法可以让我至少得到通知或回显一个未得到处理的结果?原因是,有时我们运行20+.HQL文件,当我们同时运行5个或更多文件时,有时很难在日志中看到一个文件是否失败以及是否需要重新运行。您可以使用类似于
{hive…| | echo'的内容,在日志中很容易找到:$?'}&
然后搜索失败消息。