【问题标题】:how to wait for first command to finish?如何等待第一个命令完成?
【发布时间】:2015-07-05 12:18:05
【问题描述】:

我正在用 bash 编写一个脚本,它在内部调用两个 bash 脚本。其中第一个脚本包括在后台运行的不同测试和第二个脚本打印第一个脚本的结果。

当我一个接一个地运行这两个脚本时,有时,第二个脚本会在第一个脚本结束之前执行,这会打印错误的结果。

我正在使用 source 命令运行这两个脚本。有更好的建议吗?

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

【问题讨论】:

  • 你真的需要获取文件,或者你可以在子shell中运行它们吗,使用../../st_new.sh ...
  • 不是真的,我也可以在子 shell 中运行它们,但这对我有帮助吗?
  • 可以给我们st_new.sh的内容吗
  • 通常,在第一个脚本结束之前,第二个脚本不应自行启动。如果它正在启动,那么很可能第一个脚本正在分叉自己以作为后台任务运行。 (有点像$0 "$@" &..)

标签: linux bash


【解决方案1】:

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。

【讨论】:

  • 我也有类似的问题。 start /wait "$(pwd)\Tools\mybat.bat" 我尝试执行此命令,但 git bash 不等待 bat 完成。有什么建议吗?
  • 我们可以使用:wait $!;代替?
  • @walknotes:你可以,但最终有人会插入一个无辜的echo "Waiting for PID $!",然后$! 将是echo 的PID ...或者不是,当echo 是一个shell 内置时。这可能意味着脚本在不同的 shell 上表现不同。经验法则:如果您需要自动变量,请复制一份。
【解决方案2】:

确保 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

【讨论】:

    猜你喜欢
    • 2011-10-20
    • 2012-03-18
    • 2019-01-16
    • 2023-04-04
    • 1970-01-01
    • 2020-08-08
    • 2019-07-07
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多