【问题标题】:Not getting idea on how to run shell script不知道如何运行 shell 脚本
【发布时间】:2020-04-01 06:34:53
【问题描述】:

我正在从 shell 运行 spark-submit 命令并将输出发送到文件(/tmp/output)。它有 3 种语句 ACCEPTED、RUNNING、FINISHED。如果被接受,则不需要任何东西。如果它正在运行,那么我必须发送邮件。我有发送邮件的逻辑。但是在 tmp/output 文件中会看到多次运行。我不知道多少次。如果我知道我可以睡到那个时候。当完成语句发生时,我需要运行查询。

/tmp/output 文件不是静态的,它将是动态的并附加 ACCEPTED, RUNNING 多次。下面是 /tmp/output 文件的例子。

spark-submit --name sparktTest --deploy-mode cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 100 > /tmp/output

string=RUNNING

tail -n0 -F /tmp/output | \
while read LINE
do
if echo "$LINE" | grep "$string" 1>/dev/null 2>&1
then
echo "I am in while loop"
aws sns publish --message file:///tmp/url.txt
break
fi
done

stringnew=FINISHED
tail -f /tmp/output | \
while read LINE
do
if echo "$LINE" | grep "$stringnew" 1>/dev/null 2>&1
then
  aws sql query execute
        break
else
    echo "Script failed"
    break
fi
done

正在运行的循环成功执行,但立即执行脚本失败。它必须等待 /tmp/output 中的 FINISHED 状态,然后执行 sql 查询。

【问题讨论】:

  • 您正在运行什么脚本,您尝试从 shell 执行的 spark 代码是什么。没有人能根据你写的理论来回答
  • 现在可以回答了吗。

标签: bash shell scripting


【解决方案1】:

您至少需要提供您的脚本,以便有人能够帮助您!因此,只需先添加更多信息,然后可能会得到一些有用的回复。

更新

你想检查 /tmp/output 中是否存在字符串,所以我假设它只有一行被第一个命令重写,因此等待 FINISHED 字符串的可能解决方案看起来像这样

string=RUNNING

while cat /tmp/output | grep $string > /dev/null
do
echo "I am in while loop"

#do your code  that you want to do while the string is RUNNING
done
# the string in the /tmp/output changed to something else then RUNNING
echo "go on .."

这段代码只是将文件输出到标准输出,然后我们用 grep 搜索字符串并且不将他打印出来,但我们仍然在 while 循环中执行所有操作。一旦字符串发生变化,您就会离开 while 循环,脚本会进一步执行

【讨论】:

  • 如果我多次执行此代码 RUNNING 将在输出文件中看到。假设在输出文件中看到 100 次运行,我将发送 100 次邮件。我不想要那个。第一次 RUNNING 发生,我想查看邮件。其他时间它应该忽略。
  • 那么您需要使用tail,因为您没有只有一行的文件。我看起来你每次都在代码的第一行覆盖文件。
【解决方案2】:

脚本,如书面将 * 等待输出中的“RUNNING”行 * 从输出中读取第 10 行 * 如果该行有'FINISHED',做sql查询,break * 否则,显示“失败”,中断

根据 OP,脚本应该等待 FINISHED。类似于第一个循环的东西

tail -F /tmp/output | \
while read LINE ; do
    if echo "$LINE" | grep "FINISHED" 1>/dev/null 2>&1 ; then
        echo "Running SQL ..."
        aws sql query execute
        break
    fi
done

请注意,此逻辑中有很多假设。特别是:

  • 没有逻辑可以捕获中止/失败的作业。它可能会永远挂在失败的作业上。
  • 它假定在“拖尾”临时输出文件时没有间隙(这可能会导致 FINISHED 消息丢失)。
  • 此外,该脚本使用/tmp/output,如果/当其他脚本使用相同的临时文件时,这很容易造成问题。

【讨论】:

  • 如何在上面的代码sn-p中提到“脚本失败”。
  • 如果您想在脚本中处理,您需要为失败提供示例输出(来自 /tmp/output)。
  • 在 /tmp/output 文件中,FAILED 只会出现一次。
  • 请将带有 FAILED 的示例输出发布到问题中。
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2011-01-16
相关资源
最近更新 更多