我正在用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.

Linux相关问答推荐

为什么我的Linuxshell 程序有时找不到它刚刚创建的文件?

列出Linux上特定目录和子目录名称的bash命令

运行系统命令失败,但相同的命令可以直接在 bash 中执行

从父目录中删除目录而不删除父目录 (Linux)

使用 grep 时如何跳过第一行和最后一行?

将 Visual Studio C++ 项目迁移到 Linux 和 CMake

Bash 更新 yaml 文件中的图像值

如何在ubuntu中通过.sh文件启动多个服务

你如何在 CentOS9 上使用 C++ fmt?

Linux合并文件

函数在 shell 脚本中抛出错误语法错误:} unexpected

每次来宾重新启动后 Vagrant 执行脚本或命令(vagrant up)

为什么 Linux (x86) 的页面大小是 4 KB,这是如何计算的?

Supervisord - 将进程标准输出重定向到控制台

试运行 cron 条目

如何以编程方式禁用硬件预取?

什么是 linux 脚本中的 start-stop-daemon?

`cd //` 中的双斜杠 // 在 Linux 中是什么意思?

如何在redhat linux上安装maven

构建窗口管理器