[英]how to wait for first command to finish?
我正在用bash编写一个脚本,它在内部调用两个bash脚本。 第一个脚本包括在后台运行的不同测试和第二个脚本打印第一个脚本的结果。
当我一个接一个地运行这两个脚本时,有时,第二个脚本会在第一个脚本结束之前执行,这会打印出错误的结果。
我正在使用source命令运行这两个脚本。 有更好的建议吗?
source ../../st_new.sh -basedir $STRESS_PATH -instances $INSTANCES
source ../../results.sh
Shell脚本,无论它们如何执行,都会在另一个之后执行一个命令。 因此,在st_new.sh
的最后一个命令完成后,您的代码将执行results.sh
。
现在有一个特殊的命令搞砸了这个: &
cmd &
表示:“启动一个新的后台进程并在其中执行cmd
。启动后台进程后,立即继续执行脚本中的下一个命令。”
这意味着&
不等待cmd
做它的工作。 我的猜测是st_new.sh
包含这样的命令。 如果是这种情况,那么您需要修改脚本:
cmd &
BACK_PID=$!
这将新后台进程的进程ID(PID)放在变量BACK_PID
。 然后,您可以等待它结束:
while kill -0 $BACK_PID ; do
echo "Process is still active..."
sleep 1
# You can add a timeout here if you want
done
或者,如果您不想要任何特殊处理/输出
wait $BACK_PID
请注意,某些程序在运行时会自动启动后台进程,即使您省略了&
。 检查文档,他们通常可以选择将PID写入文件,或者您可以使用选项在前台运行它们,然后使用shell的&
命令来获取PID。
确保st_new.sh最终能够识别出什么(比如首先删除文件时触摸/tmp/st_new.tmp并始终启动st_new.sh的一个实例)。
然后进行轮询循环。 首先睡觉你认为应该等待的正常时间,并在每个循环中等待很短的时间。 这会产生类似的结果
max_retry=20
retry=0
sleep 10 # Minimum time for st_new.sh to finish
while [ ${retry} -lt ${max_retry} ]; do
if [ -f /tmp/st_new.tmp ]; then
break # call results.sh outside loop
else
(( retry = retry + 1 ))
sleep 1
fi
done
if [ -f /tmp/st_new.tmp ]; then
source ../../results.sh
rm -f /tmp/st_new.tmp
else
echo Something wrong with st_new.sh
fi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.