[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Überprüfen ob ein Script schon läuft



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 :)






Reply to: