我有一个基本上看起来像这样的Bash脚本:
#!/bin/bash
command_1 &
command_a &
command_b &
command_c &
wait
echo "done"
我在命令末尾使用&
在后台执行一些命令。然后我等待命令以wait
结束。但我只想等待a
的命令b
,c
和1
,而不是。我怎样才能做到这一点?是否可以在不收集数组中的命令a
,b
和c
的PID并等待那些PID的情况下完成? (这是我到目前为止所做的,但它有点复杂。)。
答案 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[@]}"