"wait" wartet nicht

29/04/2008 - 07:43 von Michael Schmarck | Report spam
Moin!

Gegeben sei folgendes Scriptchen:

#! /usr/bin/bash
grep -v \# oratab | tr : ' ' | while read ORACLE_SID ORACLE_HOME start; do
(
echo $ORACLE_SID ; sleep 5 ; echo Genug geschlafen für $ORACLE_SID
) &
done
wait
echo Fertig
# EOF #

Dieses Script rufe ich dann auf:

PROD01
TEST01
Fertig

real 0m0.025s
user 0m0.000s
sys 0m0.020s
nach aufruf

Genug geschlafen für TEST01

Es wurde sofort "nach aufruf" ausgegeben und das "wait" im Script
hat irgendwie auch nicht funktioniert (es wurde sofort "Fertig"
ausgegeben). Eigentlich hàtte die Ausgabe so aussehen sollen:

PROD01
TEST01
Genug geschlafen für PROD01
Genug geschlafen für TEST01
Fertig
(Ausgabe von time)
nach aufruf

Aber ganz offensichtlich war das nicht so.

Warum hat das "wait" nicht funktioniert?

GNU bash, version 3.00.16(1)-release (sparc-sun-solaris2.10)

GNU bash, version 3.2.33(1)-release (i686-pc-linux-gnu)

Vielen Dank,

Michael

PS:
PROD01:/opt/apps/oracle/product/9.2.04:Y
TEST01:/opt/apps/oracle/product/9.2.04:Y
 

Lesen sie die antworten

#1 Heike C. Zimmerer
29/04/2008 - 08:51 | Warnen spam
Michael Schmarck writes:

Gegeben sei folgendes Scriptchen:

#! /usr/bin/bash
grep -v \# oratab | tr : ' ' | while read ORACLE_SID ORACLE_HOME start; do
(
echo $ORACLE_SID ; sleep 5 ; echo Genug geschlafen für $ORACLE_SID
) &
done
wait
echo Fertig
# EOF #

Dieses Script rufe ich dann auf:



[ und wait wartet nicht ]

Das ist vertrackt, ja. Durch Deine Pipe làuft die Schleife in einer
Subshell und Dein Hintergrundprozess ist ein Kind davon. Diese
terminiert aber am Ende des Inputs. Damit sind Deine
Hintergrundprozesse verwaist, nicht aber Kind der Hauptshell.

Anders herum ausgedrückt: Die Hintergrundprozesse wurden so gestartet
wie sonst gemeinhin Daemons gestartet werden.

Das erwartete Ergebnis solltest Du bekommen, wenn Du den Bereich von
wait bis hinter wait zusàtzlich klammerst (damit der wait auch noch in
der Pipe làuft (- nicht getestet)).

Ähnliche fragen