Ich versuche eine While-Schleife zu erstellen, die darauf wartet, dass ein Kopierjob abgeschlossen wird. Um den Status der laufenden Jobs zu erhalten, verwende ich: Jobs -l | grep -c "Running"Jobs -l-Befehl muss zweimal ausgeführt werden, um zu aktualisieren?
Ich habe es auf den folgenden Code vereinfacht. Wenn der Job abgeschlossen ist, wird "erfolgreich ausgeführter Befehl" ausgedruckt. Was ich sehe ist, dass der Job abgeschlossen ist, aber die While-Schleife immer eine zusätzliche Schleife.
#!/usr/bin/ksh
execCmd()
{
$*
if [ $? -ne 0 ]
then
exit
else
echo "successfully executed command: \"$*\""
fi
}
execCmd "sleep 10"&
NPROC=`jobs -l | grep -c "Running"`
while [[ $NPROC != "0" ]]; do
echo "$NPROC copy script is still working..."
sleep 2
NPROC=`jobs -l | grep -c "Running"`
echo $NPROC
done
Der einzige Weg, die ich gefunden habe, dies zu lösen, ist die jobs -l
Befehl zweimal ausgeführt werden, z:
jobs -l
NPROC=`jobs -l | grep -c "Running"`
Warum -l nicht Arbeitsplätze erhalten nicht sofort aktualisiert, wenn meine ExecCmd Funktion beendet?
Ich realisiere, dass es hier albern aussieht, aber ich habe das Skript massiv vereinfacht. Stellen Sie sich vor, der Schlafbefehl ist etwas, das ein echter Prozess ist. Der Grund, warum ich es losgelöst habe, ist, weil das Endziel darin besteht, einige dieser Befehle gleichzeitig auszuführen. – gmate2008
Ich zögere nicht für zehn Sekunden und nehme dann an, dass es funktioniert hat. Der springende Punkt ist, dass es in der while-Schleife bleibt, bis alle Jobs beendet sind, auch wenn sie länger dauern als erwartet. Wenn Sie den obigen Code tatsächlich ausführen, werden Sie sehen, dass der Befehl abgeschlossen ist (wenn "erfolgreich ausgeführter Befehl:" ausgedruckt wird und die while-Schleife dann ein zusätzliches "Kopierskript funktioniert noch ..." ausgibt). – gmate2008