【问题标题】:Execute bash script loop without exit on error执行bash脚本循环而不退出错误
【发布时间】:2015-02-25 12:09:57
【问题描述】:

我要做的是为文件夹中的每个数据集运行几个 hadoop 作业。我正在使用如下循环:

    hdfs dfs -ls | grep -o '[0-9]*x[0-9]*$'|while read line;
    do
    echo "Operator: Spark KMeans, Dataset: $line"
    ./bspark.sh spark_kmeans $line 6 20
    sleep 30s 
    done

某些作业可能会失败。如果出现错误,是否可以继续下一行?

【问题讨论】:

  • 不确定你在问什么 - 如果“some_other_script.sh”中发生错误,while 将继续循环,除非你明确告诉它退出。
  • 无论如何,循环将继续下一次迭代(除非您使用set -e 运行脚本,在这种情况下,请使用这个绝对重要的细节更新您的问题)。
  • 另外,don't parse ls output
  • @tripleee 我为许多数据集运行它,但由于某种原因它停止了,没有达到其他迭代。
  • 由于外部循环是while read,如果./bspark.sh 消耗了标准输入的其余部分,则将终止循环。在失败的情况下会发生这种情况吗?

标签: linux bash shell unix ubuntu


【解决方案1】:

我能想到的几点:

  • 您的while 循环正在使用STDIN。我想知道bspark.sh 是否也在使用 STDIN 并且可能会吃掉你的输入。
  • bspark.sh 是否会以某种方式杀死您的程序?
  • 您的 while 循环解析是否如您所想?

您可以尝试以下几件事:

  • 在您的bspark.sh 行前面放置一个echo。与其实际执行bspark.sh,不如看看命令是什么样子的。这将使您了解脚本实际在做什么。

  • 使用set -xv 打开shell 调试。 -v 在 shell 插值之前显示命令行,-x 在 shell 处理后显示命令行。您可以将$PS4 设置为\$LINENO> 以在打印调试信息时查看行号。让您了解发生错误的位置。

    set +xv 关闭调试。我发现通过我的 shell 脚本将这些添加到各个地方以查看发生了什么很有用。

【讨论】:

  • bspark.sh 使用 spark-submit 命令执行 spark 作业。实际上它是一个 scala 程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2018-05-31
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多