Re: Überprüfen ob ein Script schon läuft
Thomas Antepoth <[EMAIL PROTECTED]> writes: > 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 == Ich nehme an, dass es beabsichtigt ist, dass das Skript kein Argument von der Kommandozeile prüft, sondern feststellt, wie oft es selbst läuft. > > Der erste "echo" liefert "4" - die beim Start von nur einer Instanz falsch > ist - Da es sich selbst prüft, läuft es wegen der Subshell (der Pipe-Teil `..|..|..`) im ersten Fall 2mal. Die anderen 2 kann ich hier nicht reproduzieren. Du suchst nach "$0". Wenn das als Namensteil eines anderen Prozesses auftaucht, wird dieser mitgezählt. Dasselbe gilt, wenn es sonstwo im ps-Output auftritt. Du musst mindestens nach ' $0$' suchen, was aber auch nur die meisten Fälle abdeckt. Dito für den grep -v. Du kannst so nicht nach 'egrep' suchen, aber auch nicht nach Sachen wie 'send_bugreport'. wc | awk '{ print $1 }' ist dasselbe wie wc -l. Andere Lösungsmöglichkeiten, die du dir anschauen könntest: - pidof dürfte das Gängigste sein: if pidof name; then echo "läuft"; fi - killall funktioniert auf Linux gut, kann aber auf anderen Unixen gewisse Überraschungen bereiten: if killall -0 name; then ... - pgrep ist nicht immer installiert: if pgrep name; then ... Gruß, Heike -- 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)
Re: Überprüfen ob ein Script schon läuft
Am 2005-03-15 23:29:32, schrieb Jan Kohnert: > [ganz kompliziertes Zeug] ;) :-) > Warum läßt du dein Script nicht ein Tempfile mit der PID des Scriptes > anlegen > und nach erfolgreichem Abschluß wieder löschen? Weil Du auch mit Programm abstürzen rechnen mußt und da wird die PID dann bei Scripten nicht weggeräumt Gut, ich mache auch: __( '/home/michelle.konzack/devel/bash/pid.template' ) / | #!/bin/bash | | NEWPID=$$ | PROGNAME=`basename $0` | | if [ ! -f /var/run/$PROGNAME.pid ] ; then | OLDPID=`cat /var/run/$PROGNAME.pid` | pstree -pan |grep ",$OLDPID)" |grep "$PROGNAME" >/dev/null 2>&1 | if [ $? = "0" ] ; then | exit 0 | fi | fi | echo $NEWPID >/var/run/$PROGNAME.pid | | | # Hier das eigentliche | # Programm einfügen. | | | rm -f /var/run/$PROGNAME.pid \__ > Da mußt du nur prüfen ob die Datei existiert (einfach) und ob die > PID zu einem > laufenden Programm gehört (auch einfach). Da PIDs nur aufsteigend > vergeben > werden, mußt du nichtmal dem Prozeßnamen der PID rausfinden, ließe Naja, ich habe teilweise mehr als 1000 Prozesse pro sekunde... Ich überprüfe lieber den $PROGRAMNAMEN mit... > sich aber > auch recht einfach realisieren. Desweiteren kannst du sogar PIDfiles > mit > Startzeiten anlegen (da kann man schauen, ob das Script deutlich zu > lange > läuft {vielleicht ist es ja steckengeblieben}) und und und... :-) > MfG Jan Greetings Michelle -- Linux-User #280138 with the Linux Counter, http://counter.li.org/ Michelle Konzack Apt. 917 ICQ #328449886 50, rue de Soultz MSM LinuxMichi 0033/3/8845235667100 Strasbourg/France IRC #Debian (irc.icq.com) signature.pgp Description: Digital signature
Re: Überprüfen ob ein Script schon läuft
Thomas Antepoth schrieb: > 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. [ganz kompliziertes Zeug] ;) Warum läßt du dein Script nicht ein Tempfile mit der PID des Scriptes anlegen und nach erfolgreichem Abschluß wieder löschen? Da mußt du nur prüfen ob die Datei existiert (einfach) und ob die PID zu einem laufenden Programm gehört (auch einfach). Da PIDs nur aufsteigend vergeben werden, mußt du nichtmal dem Prozeßnamen der PID rausfinden, ließe sich aber auch recht einfach realisieren. Desweiteren kannst du sogar PIDfiles mit Startzeiten anlegen (da kann man schauen, ob das Script deutlich zu lange läuft {vielleicht ist es ja steckengeblieben}) und und und... > t++ MfG Jan -- OpenPGP Key-Fingerprint: 0E9B 4052 C661 5018 93C3 4E46 651A 7A28 4028 FF7A pgp8MNUiwXkfU.pgp Description: PGP signature
Re: Überprüfen ob ein Script schon läuft
On Tue, Mar 15, 2005 at 10:00:42PM +0100, Thomas Antepoth wrote: > On Tue, 15 Mar 2005, Christian Knoke wrote: > > > > [ ... Testscript snipped ... ] > > Nicht unbedingt. In der zweiten Version dürfte der Output von ps xufa als > > Parameter des Befehls echo in der Prozesstabelle auftauchen, in der ersten > > nicht. Kleiner Denkfehler von mir, zu dem Zeitpunkt wird die Prozesstabelle ja gar nicht mehr gelesen, das passiert vorher. > Kein Problem - kann man testen, indem man den Zweig "| wc | awk ..." > entfernt. > > > Dann sieht das Testscript so aus: > > == cut == > #!/bin/bash > > echo "Erste Version" > isrunning=`ps xufa | grep "$0" | grep -v grep` An dieser Stelle spawnd die Shell 3 Prozesse, und die werden dann auch gezählt. > Erste Version > root 28658 0.0 0.2 2276 1028 pts/4 S+ 21:52 0:00 \_ /bin/bash > /usr/local/bin/local-backup.sh > root 28659 0.0 0.2 2276 1036 pts/4 R+ 21:52 0:00 \_ /bin/bash > /usr/local/bin/local-backup.sh > root 28661 0.0 0.2 2276 1036 pts/4 R+ 21:52 0:00 \_ /bin/bash > /usr/local/bin/local-backup.sh > root 28662 0.0 0.2 2276 1036 pts/4 R+ 21:52 0:00 \_ /bin/bash > /usr/local/bin/local-backup.sh > Es ist also richtig, daß in der ersten Version falsch gezählt wird. Gruß Christian -- Christian Knoke* * *http://cknoke.de * * * * * * * * * Ceterum censeo Microsoft esse dividendum. -- 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)
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 :) -- 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)
Re: Überprüfen ob ein Script schon läuft
Hallole On Tue, 15 Mar 2005, Michelle Konzack wrote: > Am 2005-03-15 21:28:58, schrieb Thomas Antepoth: > > [ Testscript ] > Du kannst ja noch das ausprobieren: > > #!/bin/bash > isrunning=`pstree -p |grep \`basename $0\` |wc -l` > echo $isrunning Huh? "wc -l" im Hause erspart den Aufruf vom "awk" - Das erwärmt mein kaltes Schwabenherz! :-) Aber auch hier wieder der gleiche Effekt: echo "Dritte Version" isrunning=`pstree -ap | grep \`basename $0\` | grep -v grep | wc -l` echo $isrunning echo "Vierte Version" s=`pstree -ap` isrunning=`echo "$s" | grep \`basename $0\` | grep -v grep | wc -l` echo $isrunning führt zum Output von: Dritte Version 5 Vierte Version 1 Andere Programme - gleicher Effekt. Mit freundlichem Grinsen :-) Thomas Antepoth
Re: Überprüfen ob ein Script schon läuft
On Tue, 15 Mar 2005, Christian Knoke wrote: > > [ ... Testscript snipped ... ] > Nicht unbedingt. In der zweiten Version dürfte der Output von ps xufa als > Parameter des Befehls echo in der Prozesstabelle auftauchen, in der ersten > nicht. Kein Problem - kann man testen, indem man den Zweig "| wc | awk ..." entfernt. Dann sieht das Testscript so aus: == cut == #!/bin/bash echo "Erste Version" isrunning=`ps xufa | grep "$0" | grep -v grep` echo $isrunning echo "Zweite Version" s=`ps xufa` isrunning=`echo "$s" | grep "$0" | grep -v grep` echo $isrunning == cut == und der Output - manuell ein wenig aufgehübscht - so: Erste Version root 28658 0.0 0.2 2276 1028 pts/4 S+ 21:52 0:00 \_ /bin/bash /usr/local/bin/local-backup.sh root 28659 0.0 0.2 2276 1036 pts/4 R+ 21:52 0:00 \_ /bin/bash /usr/local/bin/local-backup.sh root 28661 0.0 0.2 2276 1036 pts/4 R+ 21:52 0:00 \_ /bin/bash /usr/local/bin/local-backup.sh root 28662 0.0 0.2 2276 1036 pts/4 R+ 21:52 0:00 \_ /bin/bash /usr/local/bin/local-backup.sh Zweite Version root 28658 0.0 0.2 2280 1036 pts/4 S+ 21:52 0:00 \_ /bin/bash /usr/local/bin/local-backup.sh Es ist also richtig, daß in der ersten Version falsch gezählt wird. Nur wieso? Mit freundlichem Grinsen t++
Re: Überprüfen ob ein Script schon läuft
Am 2005-03-15 21:28:58, schrieb Thomas Antepoth: > Hallo geehrtes Publikum, > #!/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 > 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? Du kannst ja noch das ausprobieren: #!/bin/bash isrunning=`pstree -p |grep \`basename $0\` |wc -l` echo $isrunning > Freundliches Grinsen > > t++ Greetings Michelle -- Linux-User #280138 with the Linux Counter, http://counter.li.org/ Michelle Konzack Apt. 917 ICQ #328449886 50, rue de Soultz MSM LinuxMichi 0033/3/8845235667100 Strasbourg/France IRC #Debian (irc.icq.com) signature.pgp Description: Digital signature
Re: Überprüfen ob ein Script schon läuft
On Tue, Mar 15, 2005 at 09:28:58PM +0100, Thomas Antepoth wrote: > > > 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? Nicht unbedingt. In der zweiten Version dürfte der Output von ps xufa als Parameter des Befehls echo in der Prozesstabelle auftauchen, in der ersten nicht. Gruß Christian -- Christian Knoke* * *http://cknoke.de * * * * * * * * * Ceterum censeo Microsoft esse dividendum. -- 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)
Überprüfen ob ein Script schon läuft
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++