백그라운드 하위 프로세스의 pid는 $! . 모든 자식 프로세스의 pid를 배열에 저장할 수 있습니다 (예 : PIDS []) .
wait [-n] [jobspec or pid …]
각 프로세스 ID pid 또는 작업 사양 jobspec에 지정된 하위 프로세스가 종료 될 때까지 기다렸다가 마지막으로 대기 한 명령의 종료 상태를 반환합니다. 작업 사양이 제공되면 작업의 모든 프로세스가 대기합니다. 인수가 제공되지 않으면 현재 활성화 된 모든 자식 프로세스가 대기하고 반환 상태는 0입니다. -n 옵션이 제공되면 작업이 종료 될 때까지 기다렸다가 종료 상태를 반환합니다. jobspec도 pid도 쉘의 활성 자식 프로세스를 지정하지 않으면 반환 상태는 127입니다.
wait 명령을 사용 하면 모든 하위 프로세스가 완료 될 때까지 기다릴 수 있으며 $? 를 통해 각 하위 프로세스의 종료 상태를 얻을 수 있습니다 . 상태를 STATUS []에 저장합니다 . 그러면 상태에 따라 무언가를 할 수 있습니다.
다음 두 가지 솔루션을 시도했으며 잘 실행됩니다. solution01 은 더 간결하지만 solution02 는 약간 복잡합니다.
solution01
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
PIDS+=($!)
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS+=($?)
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done
solution02
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
i=0
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
pid=$!
PIDS[$i]=${pid}
((i+=1))
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
i=0
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS[$i]=$?
((i+=1))
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done