等待除Bash中的一个进程之外的所有进程

时间:2014-05-14 10:41:31

标签: bash parallel-processing wait

我有一个基本上看起来像这样的Bash脚本:

#!/bin/bash

command_1 &

command_a &
command_b &
command_c &

wait

echo "done"

我在命令末尾使用&在后​​台执行一些命令。然后我等待命令以wait结束。但我只想等待a的命令bc1而不是。我怎样才能做到这一点?是否可以在不收集数组中的命令abc的PID并等待那些PID的情况下完成? (这是我到目前为止所做的,但它有点复杂。)。

2 个答案:

答案 0 :(得分:6)

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

command_1 &

( command_a & command_b & command_c & wait )

echo "done"

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

答案 1 :(得分: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[@]}"