Wie hier gerade entdeckt, ist das Problem, dass Sie warten müssen, bis die Programme, die Sie von Ihrem Skript ausführen, ihre Jobs beenden.
Wenn Sie in Ihrem Skript ein Programm im Hintergrund ausführen, können Sie etwas mehr ausprobieren.
Im Allgemeinen ermöglicht ein Aufruf von sync
vor dem Beenden das Leeren von Dateisystempuffern und kann ein wenig helfen.
Wenn Sie im Skript einige Programme im Hintergrund ( &
) starten , können Sie warten , bis sie beendet sind, bevor Sie das Skript verlassen. Eine Vorstellung davon, wie es funktionieren kann, finden Sie unten
#!/bin/bash
program_1 &
PID_PROGRAM_1=${!}
program_2 &
wait ${!}
daemon_1 &
program_3 &
PID_PROGRAM_3=${!}
sync
wait $PID_PROGRAM_1
wait $PID_PROGRAM_3
Da es wait
sowohl mit Jobs als auch mit PID
Zahlen funktioniert, sollte eine träge Lösung darin bestehen, am Ende des Skripts zu setzen
for job in `jobs -p`
do
wait $job
done
Schwieriger ist die Situation, wenn Sie etwas ausführen, das etwas anderes im Hintergrund ausführt, weil Sie das Ende des gesamten untergeordneten Prozesses suchen und abwarten müssen (falls dies der Fall ist) : Wenn Sie beispielsweise einen Daemon ausführen , ist dies wahrscheinlich nicht der Fall zu warten endet es :-).
Hinweis:
wait $ {!} bedeutet "Warten, bis der letzte Hintergrundprozess abgeschlossen ist", wobei $!
die PID des letzten Hintergrundprozesses angegeben ist. So setzt wait ${!}
kurz nach program_2 &
entsprechen direkt auszuführen , program_2
ohne sie im Hintergrund senden mit&
Mit Hilfe von wait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification