Warum bleibt der letzte Hintergrundjob in der Bash hängen?

Warum bleibt der letzte Hintergrundjob in der Bash hängen?

Hier ist ein für Bash geschriebenes Skript:

#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
#   jobs
    echo "Waiting("$t")..."
    JCNT=`jobs | wc -l`
    echo "JCNT="$JCNT
    if [ $JCNT -eq 0 ]; then
        break
    fi
    sleep 1
done
exit 0

Es funktioniert 10 Sekunden lang, aber nicht wie erwartet 3 Sekunden lang. Aber wenn man den Befehl „Jobs“ auskommentiert, funktioniert es einwandfrei. Ich habe keine Ahnung, warum. Können Sie mir helfen?

Die Skriptausgabe mit „Jobs“ kommentiert:

Waiting(10)...
JCNT=3
Waiting(9)...
JCNT=2
Waiting(8)...
JCNT=1
Waiting(7)...
JCNT=1
Waiting(6)...
JCNT=1
Waiting(5)...
JCNT=1
Waiting(4)...
JCNT=1
Waiting(3)...
JCNT=1
Waiting(2)...
JCNT=1
Waiting(1)...
JCNT=1
Waiting(0)...
JCNT=1

Und mit dem unkommentierten „Jobs“-Befehl:

[1]   Running                 sleep 1 &
[2]-  Running                 sleep 2 &
[3]+  Running                 sleep 3 &
Waiting(10)...
JCNT=3
[1]   Done                    sleep 1
[2]-  Running                 sleep 2 &
[3]+  Running                 sleep 3 &
Waiting(9)...
JCNT=2
[2]-  Done                    sleep 2
[3]+  Running                 sleep 3 &
Waiting(8)...
JCNT=1
[3]+  Done                    sleep 3
Waiting(7)...
JCNT=0

HINZUGEFÜGT

Ich habe das Skript folgendermaßen geändert:

#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
    KKK=`jobs`
    echo $KKK
    echo "Waiting("$t")..."
    JCNT=`jobs | wc -l`
    echo "JCNT="$JCNT
    if [ $JCNT -eq 0 ]; then
        break
    fi
    sleep 1
done
exit 0

... und habe festgestellt, dass es Informationen zum letzten erledigten Auftrag gibt:

[3] Done sleep 3

Der Aufruf von „jobs“ löscht lediglich die Liste der erledigten Jobs. „jobs|wc -l“ ist der falsche Weg, um aktive Jobs zu zählen. Der richtige Weg ist „jobs -r|wc -l“.

Antwort1

Es beantwortet Ihre Frage nicht, nur als Hinweis:

wenn Sie den Job separat in der Schleife ausführen. Es funktioniert/zählt wie erwartet.

Aber ich weiß im Moment nicht genau, warum.

verwandte Informationen