Bash 不知道如何运行shell脚本

Bash 不知道如何运行shell脚本,bash,shell,scripting,Bash,Shell,Scripting,我正在从shell运行spark submit命令,并将输出发送到一个文件(/tmp/output)。它有接受、运行、完成3种语句。如果接受,则无需任何要求。如果它正在运行,那么我必须发送邮件。我有发送邮件的逻辑。但是在tmp/output文件中会多次看到running。我不知道有多少次。如果我知道我可以一直睡到那时。当完成语句出现时,我需要运行查询 /tmp/output文件不是静态的,它将是动态的,并接受append,运行多次。下面是/tmp/output文件的示例 spark-submit

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

/tmp/output文件不是静态的,它将是动态的,并接受append,运行多次。下面是/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中的完成状态,然后执行sql查询

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

更新

您需要检查/tmp/output中是否存在字符串,因此我假设只有一行被第一个命令重写,因此等待完成的字符串的可能解决方案如下所示

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循环,脚本将进一步执行

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

更新

您需要检查/tmp/output中是否存在字符串,因此我假设只有一行被第一个命令重写,因此等待完成的字符串的可能解决方案如下所示

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循环,脚本将进一步执行 *等待输出中的“运行”行 *从输出中读取第10行 *如果行已“完成”,请执行sql查询,然后断开 *否则,显示“失败”,中断

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

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
注意,在这个逻辑中有很多假设。特别是:

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

    • 脚本,如书面所示 *等待输出中的“运行”行 *从输出中读取第10行 *如果行已“完成”,请执行sql查询,然后断开 *否则,显示“失败”,中断

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

      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
      
      注意,在这个逻辑中有很多假设。特别是:

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

      您正在运行的脚本,您试图从shell执行的spark代码是什么。没有人可以根据你写的理论来回答。你正在运行什么脚本,你试图从shell执行什么样的spark代码。没有人可以根据您编写的理论进行回答。您现在可以回答了吗。如何在上述代码段中提到“脚本失败”。如果要在脚本中处理此问题,您需要提供失败的示例输出(来自/tmp/output)。在/tmp/output文件中,FAILED将只出现一次。请将带有FAILED的示例输出发布到问题中。如何在上述代码段中提到“script FAILED”。如果这是要在脚本中处理的内容,则需要为失败提供示例输出(从/tmp/output)。在/tmp/output文件中,FAILED将只显示一次。请将带有FAILED的示例输出发布到问题中。如果我实现此代码多次,将在输出文件中看到正在运行的代码。假设在输出文件中看到100次运行,我将发送邮件100次。我不想那样。第一次运行时,我想查看邮件。剩下的时候它应该忽略。那么你需要用tail,因为你没有一个只有一行的文件。在代码的第一行中,您似乎每次都重写该文件。如果我多次实现该代码,则输出文件中将显示正在运行的代码。假设在输出文件中看到100次运行,我将发送邮件100次。我不想那样。第一次运行时,我想查看邮件。剩下的时候它应该忽略。那么你需要用tail,因为你没有一个只有一行的文件。我看起来好像每次在代码的第一行中都重写了该文件。