On Tue, 2005-03-15 at 21:28 +0100, Thomas Antepoth wrote:
> Hallo geehrtes Publikum,
> 
> 
> um im Shell-Script herauszufinden, ob ein Prozess schon lÃuft, wird die 
> Prozessliste nach dem Namen des Scriptes in $0 gegrepped und das Pattern 
> "grep" entfernt. Ist die Anzahl der Prozesse grÃÃer als 1 dann lÃuft der 
> Prozess bereits und das Script muss abgebrochen werden.
> 
> Soweit die Theorie.
> 
> Dieses Scriptlein ist zum Testen:
> 
> == cut ==
> #!/bin/bash
> 
> isrunning=`ps xufa | grep "$0" | grep -v grep | wc | awk '{ print $1 }'`
> echo $isrunning
> 
> s=`ps xufa`
> isrunning=`echo "$s" | grep "$0" | grep -v grep | wc | awk '{ print $1 }'`
> echo $isrunning
> == cut ==
> 
> Der erste "echo" liefert "4" - die beim Start von nur einer Instanz falsch 
> ist - der zweite "echo" liefert das korrekte "1".
> 
> Wo - mein VerstÃndnis mal beiseite gelassen - hebt's da? Diese beiden 
> Zeilen "isrunning=..." mÃÃten doch Ãquivalent sein, oder?
> 
> 
> Freundliches Grinsen
> 
>       t++

OK, ich versuch's einfach zu erklÃren. Dein Skript macht mehrere Forks,
mindestens einen weil zwischen den backticks isrunning=`blah` eine Pipe
steht. Es kann nicht nicht die Subprozesse in der Pipe (ansynchron)
forken, deren stdin/stdout deskriptoren verbinden und gleichzeitig den
gesamten Output der Pipe capturen. Dazu wird also mindestens eine
Subshell gebraucht, du kriegst also mindestens immer zwei Instanzen.

Die zweite Instanz nun forkt Subprozesse fÃr jeden Prozess in der Pipe.
Zwischen dem Fork und Exec (ein kleiner Moment), stehen diese Prozesse
noch unter deinem Scriptnamen in der Prozesstabelle. D.h. sie kommen
hinzu, wenn das ps sie in diesem Moment erwischt.

Und das ist schon alles. Benutze die zweite Version, die ist OK. Warum?
Weil die Pipe noch nicht in Aktion ist und, was den Fork fÃr ps angeht,
wenn ps ausgefÃhrt wird ja das Exec schon gelaufen ist :)





-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)

Antwort per Email an