【问题标题】:Wait for all except of one process in Bash等待 Bash 中除一个进程之外的所有进程
【发布时间】:2014-07-02 08:55:52
【问题描述】:

我有一个基本上如下所示的 Bash 脚本:

#!/bin/bash

command_1 &

command_a &
command_b &
command_c &

wait

echo "done"

我在后台使用命令末尾的& 执行一些命令。然后我等待命令以wait 结束。但我只想等待abc 的命令,not for 1。我怎样才能做到这一点?是否可以在不将命令abc 的 PID 收集到数组中并等待这些 PID 的情况下完成? (这是我目前尝试过的,但有点复杂。)。

【问题讨论】:

  • 不,除了保留 PID 之外别无他法。
  • 嗯...好吧...真可惜...

标签: bash parallel-processing wait


【解决方案1】:

要完成答案列表,这是我收集 PID 的“旧”解决方案:

我在一个子 shell 中执行每个命令(或几个命令)并将 PID 存储在一个数组中。启动所有命令后,我循环遍历数组并等待每个 PID:

#!/bin/bash

INDEX=0

command_1 &

(
    command_a
) &

PIDS[$INDEX]=$!
INDEX=$[INDEX + 1]

(
    command_b
    command_c
) &

PIDS[$INDEX]=$!
INDEX=$[INDEX + 1]

for job in ${PIDS[@]}
do
    echo "wait for $job"
    wait $job
done

echo "done"

command_1 &
command_a & wait_pids+=($!)
command_b & wait_pids+=($!)
command_c & wait_pids+=($!)
wait "${wait_pids[@]}"

【讨论】:

  • 这可以更简单地完成;我将添加到底部,您可以根据需要进行编辑。
【解决方案2】:

您可以在子 shell 中执行命令 a、b、c。

command_1 &

( command_a & command_b & command_c & wait )

echo "done"

如果您不想在子 shell 中执行 a、b、c,那么您需要跟踪各个 PID。

【讨论】:

  • 谢谢!我还将发布我的收集 PID 的解决方案。
  • +1 请注意,在子shell 中运行也没有什么缺点。由于每个命令都在后台进程中运行,因此您已经失去了让它们影响当前 shell 的能力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
相关资源
最近更新 更多