如何等待第一个命令完成



我正在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在最后做一些你能识别的事情(比如当你首先删除文件并总是启动st_new.sh的一个实例时,触摸/tmp/st_new.tmp)。
然后进行轮询循环。在你认为应该等待的正常时间先睡觉,并且在每个循环中等待短时间。这将导致类似的情况

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

更简单的解决方案是使用&而不是&。在你的情况下,你可以做

source ../../st_new.sh -basedir $STRESS_PATH -instances $INSTANCES &&
source ../../results.sh

相关内容

  • 没有找到相关文章

最新更新