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

2005-03-16 Diskussionsfäden Heike C. Zimmerer
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

2005-03-15 Diskussionsfäden Michelle Konzack
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

2005-03-15 Diskussionsfäden Jan Kohnert
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

2005-03-15 Diskussionsfäden Christian Knoke
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

2005-03-15 Diskussionsfäden Bruno Hertz
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

2005-03-15 Diskussionsfäden Thomas Antepoth
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

2005-03-15 Diskussionsfäden Thomas Antepoth
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

2005-03-15 Diskussionsfäden Michelle Konzack
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

2005-03-15 Diskussionsfäden Christian Knoke
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

2005-03-15 Diskussionsfäden Thomas Antepoth
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++