Próbuję utworzyć skrypt, który uruchomi wiele poleceń w tle. Do każdego polecenia w tle muszę uzyskać kod powrotu.
Próbowałem następującego skryptu:
#!/bin/bash
set -x
pid=()
return=()
for i in 1 2
do
echo start $i
ssh mysql "/root/test$i.sh" &
pid[$i]=$!
done
for i in ${#pid[@]}
do
echo ${pid[$i]}
wait ${pid[$i]}
return[$i]=$?
if [ ${return[$i]} -ne 0 ]
then
echo mail error
fi
done
echo ${return[1]}
echo ${return[2]}
Mój problem dotyczy pętli oczekiwania, jeśli drugi pid zakończy się przed pierwszym, nie będę w stanie uzyskać kodu powrotu.
Wiem, że mogę uruchomić czekaj pid1 pid2, ale dzięki temu poleceniu nie mogę uzyskać kodu powrotu wszystkich poleceń.
Dowolny pomysł ?
Odpowiedź Stéphane'a jest dobra, ale wolałbym
który będzie iterował po kluczach
pid
tablicy, bez względu na to, które wpisy nadal istnieją, więc możesz je dostosować, zerwać z pętli i ponownie uruchomić całą pętlę, a ona po prostu zadziała. Nai
początek nie potrzebujesz kolejnych wartości .Oczywiście, jeśli masz do czynienia z tysiącami procesów, być może podejście Stépane'a byłoby frakcjonalnie bardziej wydajne, jeśli masz nierzadką listę.
źródło