2016-06-28 6 views
1

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?

Antwort

0

Warum trennen Sie einen Schlafbefehl, der nichts tut? Wenn Sie einen Alarm für sich selbst setzen möchten, ist das nicht der richtige Weg. (Sie würden schlafen und dann töten -14 $$, aber ich schweife ab.)

While-Schleifen nicht eine zusätzliche Zeit Schleife; Sie durchlaufen nur eine Schleife, solange die Bedingung wahr ist. Daher ist der Zustand, den Sie für falsch halten sollten, tatsächlich wahr.

Da die Verbindung getrennt ist, wurde der Ruhezustand möglicherweise erst gestartet, nachdem der erste Test ausgeführt wurde. Sie können sich Herzschmerz ersparen, indem Sie vor dem Test eine Sekunde lang schlafen.

+0

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

+0

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