Le pid d'un processus enfant en arrière-plan est stocké dans $! . Vous pouvez stocker tous les pids des processus enfants dans un tableau, par exemple PIDS [] .
wait [-n] [jobspec or pid …]
Attendez que le processus enfant spécifié par chaque ID de processus pid ou spécification de tâche jobspec se termine et renvoie l'état de sortie de la dernière commande attendue. Si une spécification de tâche est fournie, tous les processus de la tâche sont attendus. Si aucun argument n'est donné, tous les processus enfants actuellement actifs sont attendus et l'état de retour est zéro. Si l'option -n est fournie, wait attend que tout travail se termine et renvoie son état de sortie. Si ni jobspec ni pid ne spécifient un processus enfant actif du shell, l'état de retour est 127.
Utilisez la commande wait, vous pouvez attendre la fin de tous les processus enfants, en attendant, vous pouvez obtenir le statut de sortie de chaque processus enfant via $? et stocker le statut dans STATUS [] . Ensuite, vous pouvez faire quelque chose en fonction du statut.
J'ai essayé les 2 solutions suivantes et elles fonctionnent bien. solution01 est plus concise, tandis que solution02 est un peu compliquée.
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