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