我正在用bash编写一个脚本,在内部调用两个bash脚本.其中,第一个脚本包括在后台运行的不同测试,第二个脚本打印第一个脚本的结果.
当我一个接一个地运行这两个脚本时,有时会在第一个脚本结束之前执行第二个脚本,从而打印错误的结果.
我正在用source命令运行这两个脚本.还有更好的建议吗?
source ../../st_new.sh -basedir $STRESS_PATH -instances $INSTANCES
source ../../results.sh
我正在用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
请注意,有些程序在运行时会自动启动后台进程,即使忽略了&
.查看文档,他们通常可以 Select 将PID写入文件,或者您可以在前台使用选项运行它们,然后使用shell的&
命令来获取PID.