Ich versuche ein Skript zu erstellen, das viele Hintergrundbefehle startet. Für jeden Hintergrundbefehl muss ich den Rückkehrcode erhalten.
Ich habe folgendes Skript ausprobiert:
#!/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]}
Mein Problem ist während der Warteschleife. Wenn die zweite PID vor der ersten endet, kann ich den Rückkehrcode nicht erhalten.
Ich weiß, dass ich wait pid1 pid2 ausführen kann, aber mit diesem Befehl kann ich nicht den Rückkehrcode aller Befehle erhalten.
Irgendeine Idee ?
Stéphanes Antwort ist gut, aber ich würde es vorziehen
Dies wird über die Schlüssel des
pid
Arrays iterieren , unabhängig davon, welche Einträge noch vorhanden sind, sodass Sie es anpassen, aus der Schleife ausbrechen und die gesamte Schleife neu starten können, und es funktioniert einfach. Und Sie brauchen zunächst keine aufeinanderfolgenden Werte voni
.Wenn Sie mit Tausenden von Prozessen zu tun haben, ist der Ansatz von Stépane möglicherweise etwas effizienter, wenn Sie eine nicht spärliche Liste haben.
quelle