如果配置单元失败,停止bash脚本

zxlwwiss  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(359)

我有一个bash脚本,它循环遍历一个文件夹并处理所有*.hql文件。有时一个配置单元脚本失败(语法、资源约束等),而不是脚本失败,它将继续运行到下一个.hql文件。
不管怎样,我可以阻止bash处理剩余的?下面是我的示例:

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

q8l4jmvw1#

添加

  1. set -e

到你剧本的顶端

w6lpcovy

w6lpcovy2#

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

  1. (( $? == 0 )) && exit 1

在hive命令之后引入上面的行,应该可以做到这一点。

jxct1oxe

jxct1oxe3#

使用此模板运行并行进程并等待其完成。添加您的 date , layer , hiveconf_all 以及其他变量:

  1. # !/bin/bash
  2. set -e
  3. # Run parallel processes and write their logs
  4. log_dir=/tmp/my_script_logs
  5. for i in `ls ${layer}/*.hql`; do
  6. echo "Processing $i ..."
  7. #Run hive in parallel and redirect to the log file
  8. hive ${hiveconf_all} -hiveconf DATE=${date} -f ${i} 2>&1 | tee "log_dir/${i}".log &
  9. done
  10. # Now wait for all processes to complete
  11. FAILED=0
  12. for job in `jobs -p`
  13. do
  14. echo "job=$job"
  15. wait $job || let "FAILED+=1"
  16. done
  17. if [ "$FAILED" != "0" ]; then
  18. echo "Execution FAILED! ($FAILED)"
  19. #Do something here, log or send message, etc
  20. exit 1
  21. fi
  22. # All processes are completed successfully!
  23. # Do something here
  24. echo "Done successfully"

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

展开查看全部

相关问题