Hi, ich verwende seit einigen SuSE-Versionen ein Skript (zum Nachstarten eines Java- Programms), welches via ps feststellt, ob der Prozess noch laeuft. Das hat bis zur Umstellung auf SuSE8.0 hervorragend funktioniert. Der Skript sieht so aus: -------------------------------------------------------------------------- #!/bin/bash SCRIPTDIR=/scripts VAR=`ps fax|grep "prog.jar"|wc -l|awk '{ print $1 }'` if [ $VAR -lt 2 ]; then /usr/lib/java/jre/bin/java -cp prog.jar & echo "Programm gestartet." else echo "Programm laeuft bereits." fi -------------------------------------------------------------------------- Seit der Umstellung auf SuSE8.0 habe ich feststellen muessen, dass mein Programm ab und an mehrfach gestartet wurde. Bei genauerem Hinschauen stellte sich heraus, dass das von mir verwendete ps scheinbar manchmal eine leere Prozessliste zurueckgibt, auf jeden Fall hat die Variable VAR in diesen Faellen den Wert 0. Das hat mich zur Umgehung in dieser Form hier genoetigt: -------------------------------------------------------------------------- #... VAR=0; while [ $VAR -eq 0 ]; do VAR=`ps fax|grep "prog.jar"|wc -l|awk '{ print $1 }'` if [ $VAR -eq 0 ]; then echo ======== `date`: "Bugfix hat zugeschlagen!">>$SCRIPTDIR/prog.log sleep 5 fi done #... -------------------------------------------------------------------------- Damit funktioniert es dann, aber das kann doch nicht der Sinn der Uebung sein? Wo mache ich hier was falsch? Und warum hat es vorher immer funktioniert? BTW: vorher heisst in dem Falle Kernel 2.2.16, momentan laeuft 2.4.18-4GB. mfg, Hannes
On Don, 05 Sep 2002 at 17:36 (+0200), Johannes Studt wrote:
Hi,
ich verwende seit einigen SuSE-Versionen ein Skript (zum Nachstarten eines Java- Programms), welches via ps feststellt, ob der Prozess noch laeuft. Das hat bis zur Umstellung auf SuSE8.0 hervorragend funktioniert. Der Skript sieht so aus:
-------------------------------------------------------------------------- #!/bin/bash
SCRIPTDIR=/scripts
VAR=`ps fax|grep "prog.jar"|wc -l|awk '{ print $1 }'` if [ $VAR -lt 2 ]; then /usr/lib/java/jre/bin/java -cp prog.jar & echo "Programm gestartet." else echo "Programm laeuft bereits." fi --------------------------------------------------------------------------
Seit der Umstellung auf SuSE8.0 habe ich feststellen muessen, dass mein Programm ab und an mehrfach gestartet wurde. Bei genauerem Hinschauen stellte sich heraus, dass das von mir verwendete ps scheinbar manchmal eine leere Prozessliste zurueckgibt, auf jeden Fall hat die Variable VAR in diesen Faellen den Wert 0. Das hat mich zur Umgehung in dieser Form hier genoetigt: [...]
Du hast bisher implizit damit gerechnet, dass der grep mit in der ps-Liste auftaucht. Das ist aber nicht sicher (dass es bisher funktioniert hat, ist IMHO Zufall). Dein Workaround ist unnötig, wenn Du den grep rausfilterst: VAR=`ps fax|grep "prog.jar"|grep -v grep | wc -l|awk '{ print $1 }'` Du musst im Hinterkopf behalten, dass ps immer eine Momentaufnahme des Geschehens liefert. BTW: Ich würde das eher so machen, ist weniger aufwändig (und benötigt ein paar Prozesse weniger): if ps -ef | grep prog.jar | grep -vq grep; then # Programm rennt bereits else # neu starten fi Zu den von mir verwendeten ps-Optionen: Seit einiger Zeit bietet der Linux-ps SysV-kompatible Optionen an, die finde ich persönlich schöner. Jan
* Jan Trippler schrieb am 06.Sep.2002:
BTW: Ich würde das eher so machen, ist weniger aufwändig (und benötigt ein paar Prozesse weniger):
if ps -ef | grep prog.jar | grep -vq grep; then
noch kürzer ist: if ps -ef | grep [p]rog.jar grep findet sich selber nicht, weil es nach prog.jar, nicht aber nach [p]rog.jar sucht.
Zu den von mir verwendeten ps-Optionen: Seit einiger Zeit bietet der Linux-ps SysV-kompatible Optionen an, die finde ich persönlich schöner.
Ja, ich auch. Allerdings finde ich, daß da mitlerweile ein kleines Chaos entstanden ist. Früher mal mußte man bei Linux ps -ax schreiben, um alle Prozesse zu erreichen, später bekam man damit zwar das gewünschte Ergebnis, aber auch immer eine "Fehlermeldung" daß es auch ohne dem - geht, also einfach nur ps ax. Heute geht beides, ohne Fehlermeldung und es geht auch ps -e. ps e ist hingegen was ganz anderes. Ich muß gestehen, ich blicke nicht mehr ganz durch. Habe auch nicht so sehr die Lust, mich immer wieder durch manpages zu quälen. Zumal die deutsche manpage nicht aktuell ist. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
Hi, ich schrieb: [...]
VAR=`ps fax|grep "prog.jar"|wc -l|awk '{ print $1 }'` if [ $VAR -lt 2 ]; then [...] Seit der Umstellung auf SuSE8.0 habe ich feststellen muessen, dass mein Programm ab und an mehrfach gestartet wurde. Bei genauerem Hinschauen stellte sich heraus, dass das von mir verwendete ps scheinbar manchmal eine leere Prozessliste zurueckgibt, auf jeden Fall hat die Variable VAR in diesen Faellen den Wert 0.
Jan Trippler antwortete:
Du hast bisher implizit damit gerechnet, dass der grep mit in der ps-Liste auftaucht. Das ist aber nicht sicher (dass es bisher funktioniert hat, ist IMHO Zufall). Dein Workaround ist unnötig, wenn Du den grep rausfilterst: VAR=`ps fax|grep "prog.jar"|grep -v grep | wc -l|awk '{ print $1 }'` Du musst im Hinterkopf behalten, dass ps immer eine Momentaufnahme des Geschehens liefert.
Das ist zwar richtig, aber IMHO hier nicht der Fall gewesen, denn dann hätte VAR nicht den Wert 0, sondern mindestens 1 haben müssen, denn wie gesagt lief das Programm noch und wurde trotzdem neu gestartet. Mein Script ist zwar falsch, weil es bei VAR<2 das Programm neu startet, aber die Prozessliste war "leer". Dagegen dürfte im Prinzip auch Deine folgende Methode nicht helfen:
BTW: Ich würde das eher so machen, ist weniger aufwändig (und benötigt ein paar Prozesse weniger):
if ps -ef | grep prog.jar | grep -vq grep; then # Programm rennt bereits else # neu starten fi
Aber danke für den Tipp, sieht viel kompetenter aus als mein Stoppelscript. :) Hannes
On Fre, 06 Sep 2002 at 14:44 (+0200), Johannes Studt wrote:
ich schrieb:
[...]
VAR=`ps fax|grep "prog.jar"|wc -l|awk '{ print $1 }'` if [ $VAR -lt 2 ]; then [...] Seit der Umstellung auf SuSE8.0 habe ich feststellen muessen, dass mein Programm ab und an mehrfach gestartet wurde. Bei genauerem Hinschauen stellte sich heraus, dass das von mir verwendete ps scheinbar manchmal eine leere Prozessliste zurueckgibt, auf jeden Fall hat die Variable VAR in diesen Faellen den Wert 0.
Jan Trippler antwortete:
Du hast bisher implizit damit gerechnet, dass der grep mit in der ps-Liste auftaucht. Das ist aber nicht sicher (dass es bisher funktioniert hat, ist IMHO Zufall). Dein Workaround ist unnötig, wenn Du den grep rausfilterst: VAR=`ps fax|grep "prog.jar"|grep -v grep | wc -l|awk '{ print $1 }'` Du musst im Hinterkopf behalten, dass ps immer eine Momentaufnahme des Geschehens liefert.
Das ist zwar richtig, aber IMHO hier nicht der Fall gewesen, denn dann hätte VAR nicht den Wert 0, sondern mindestens 1 haben müssen, denn wie gesagt lief das Programm noch und wurde trotzdem neu gestartet.
Ja, ich sollte mir abgewöhnen, Mails mitten in der Nacht zu schreiben (haha). Ich meinte es so: Die Abfrage $VAR -lt 2 stellt ja sicher, dass bei gezählten 0 oder 1 Ergebniszeilen das Programm neu gestartet wird. Das kann aber eben heissen, dass (wenn der grep _nicht_ mitgezählt wird) bereits eine Instanz läuft. Jan
Hi again, ich schrieb:
Das ist zwar richtig, aber IMHO hier nicht der Fall gewesen, denn dann hätte VAR nicht den Wert 0, sondern mindestens 1 haben müssen, denn wie gesagt lief das Programm noch und wurde trotzdem neu gestartet.
Jan Trippler antwortete:
Ja, ich sollte mir abgewöhnen, Mails mitten in der Nacht zu schreiben (haha). Ich meinte es so: Die Abfrage $VAR -lt 2 stellt ja sicher, dass bei gezählten 0 oder 1 Ergebniszeilen das Programm neu gestartet wird. Das kann aber eben heissen, dass (wenn der grep _nicht_ mitgezählt wird) bereits eine Instanz läuft.
Klar. Der Fehler liegt auch ganz meinerseits, denn ich habe sicher vergessen zu erwähnen, dass ich zum Zwecke der Fehlersuche tagelang den Wert der Variablen VAR in ein Logfile geschrieben habe, wenn das Script der Meinung war, das Programm nachstarten zu wollen. Und dabei ist mir eben aufgefallen, dass VAR nicht den Wert 1 hatte (wie es ja sein müsste, wenn zwar das noch laufende Programm, nicht jedoch grep gezählt würde), sondern 0. Darum habe ich auch die Schleife aussen um die Abfrage herumgebaut, die nach Nullwert checkt. Also abgesehen von dem logischen Fehler (if $VAR lt 2) ist da auch noch ein anderer Wurm drin und mir wird nicht wirklich klar, was das sein könnte. Hannes
Hallo, On Sat, 07 Sep 2002, Johannes Studt wrote:
Also abgesehen von dem logischen Fehler (if $VAR lt 2) ist da auch noch ein anderer Wurm drin und mir wird nicht wirklich klar, was das sein könnte.
Teste mal folgendes (aus den verschiedenen Loesungen): ==== PROCS=`ps ax | grep -c '/usr/lib/java/jre/bin/java -cp [p]rog.jar'` if test $PROCS -eq 0; then ## ^^^^^^ ohne Anfuehrungszeichen, da numerischer Vergleich! /usr/lib/java/jre/bin/java -cp prog.jar fi ==== Das grep sollte nach dem 'jar' erfolgen, da sonst jeder java Prozess gefunden wird -- aus diesem Grund geht uebrigens startproc/killproc nur, wenn man ein explizites pidfile angibt: ==== ungetestet! ==== PIDFILE="/var/run/prog.pid" [..] startproc -f "$PIDFILE" /usr/lib/java/jre/bin/java -cp prog.jar [..] killproc -f "$PIDFILE" -TERM /usr/lib/java/jre/bin/java ==== -dnh -- Deep in the human unconcious is a pervasive need for a logical universe that makes sense. But the real universe is always one step beyond logic. -- from "The Sayings of Muad'Dib" by the Princess Irulan -- from "Dune" by Frank Herbert
Hi, David Haller schrieb:
Teste mal folgendes (aus den verschiedenen Loesungen): [...] Das grep sollte nach dem 'jar' erfolgen, da sonst jeder java Prozess
ich mache das jetzt, als Quintessenz der verschiedenen Antworten, so: | #!/bin/bash | | if ps -ef|grep [p]rog.jar &>/dev/null; then | echo "Proxy laeuft bereits." | else | /usr/lib/java/jre/bin/java -cp prog.jar & | echo "Proxy gestartet." | fi Mal sehen, ob das über mehrere Tage hinweg funktioniert, ohne mein altes Problem zu erzeugen.
gefunden wird -- aus diesem Grund geht uebrigens startproc/killproc nur, wenn man ein explizites pidfile angibt:
==== ungetestet! ==== PIDFILE="/var/run/prog.pid" [..] startproc -f "$PIDFILE" /usr/lib/java/jre/bin/java -cp prog.jar [..] killproc -f "$PIDFILE" -TERM /usr/lib/java/jre/bin/java ====
Das habe ich auch getestet, bekomme es aber irgendwie nicht hin, dass die PID des Java-Prozesses in dem PID-File zu liegen kommt. Wie kann ich startproc oder auch Java dazu überreden, die PID dort abzulegen, wo ich das gern hätte? mfg, Hannes
Hi nochmal, ich selbst verfasste: [...]
| #!/bin/bash | | if ps -ef|grep [p]rog.jar &>/dev/null; then | echo "Proxy laeuft bereits." | else | /usr/lib/java/jre/bin/java -cp prog.jar & | echo "Proxy gestartet." | fi
und das funktioniert ja erstmal. Aber: pc:/scripts # ps -ef|grep [t]est root 27385 23748 0 21:16 pts/0 00:00:00 grep test pc:/scripts # ps -ef|grep [t]est. pc:/scripts # Warum bringt das Konstrukt "ps -ef|grep [x]yz" nur dann den gewünschten Erfolg, wenn im gegrepten String ein Punkt "." enthalten ist? Mit meinem Grep nach prog.jar funktioniert das, aber wenn ich auf selbige Methode ein normales Programm testen will, falle ich auf die Nase, weil grep sich selbst findet. *ratlos* mfg, Hannes
On Don, 12 Sep 2002 at 21:22 (+0200), Johannes Studt wrote: [...]
pc:/scripts # ps -ef|grep [t]est root 27385 23748 0 21:16 pts/0 00:00:00 grep test pc:/scripts # ps -ef|grep [t]est. pc:/scripts #
Warum bringt das Konstrukt "ps -ef|grep [x]yz" nur dann den gewünschten Erfolg, wenn im gegrepten String ein Punkt "." enthalten ist? Mit meinem Grep nach prog.jar funktioniert das, aber wenn ich auf selbige Methode ein normales Programm testen will, falle ich auf die Nase, weil grep sich selbst findet. *ratlos*
Ich vermute mal, dass in Deinem Verzeichnis /scripts eine Datei namens test liegt. In diesem Fall wird der reguläre Ausdruck [t]est durch die Shell zu test expandiert. Der Sinn des Konstrukts [t]est liegt ja darin, dass grep sich nicht selbst findet - wenn meine Vermutung stimmt, kriegt grep aber gar nicht mehr [t]est zu sehen, sondern eben test, und da verjagst Du Dich sozusagen selber ;-) Der Punkt ist ein Sonderzeichen für grep und bedeutet *ein beliebiges Zeichen*. Die Konfusion entsteht hier, weil die [] für die Shell und grep die gleiche Bedeutung haben. Auf die Schnelle hilft: ps -ef | grep "[t]est" Dann expandiert die Shell nicht mehr den Dateinamen. man 7 regex Jan P.S.: Ich würde es mir abgewöhnen, Dateien *test* zu nennen. Das sorgt nur für Verwirrung, weil test ein Shell-Builtin ist.
Hi, Jan Trippler schrieb:
Ich vermute mal, dass in Deinem Verzeichnis /scripts eine Datei namens test liegt. In diesem Fall wird der reguläre Ausdruck [t]est [...] Auf die Schnelle hilft: ps -ef | grep "[t]est" Dann expandiert die Shell nicht mehr den Dateinamen.
Vollkommen korrekt. *mirandenkopfschlag* Ich führe zu meiner Entschulding die späte Stunde an und hoffe, dass das akzeptiert werden kann. ;-)
P.S.: Ich würde es mir abgewöhnen, Dateien *test* zu nennen. Das sorgt nur für Verwirrung, weil test ein Shell-Builtin ist.
Das werde ich mir zu merken versuchen. mfg, Hannes
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Am Donnerstag, 5. September 2002 17:36:17 schrieb Johannes Studt:
ich verwende seit einigen SuSE-Versionen ein Skript (zum Nachstarten eines Java- Programms), welches via ps feststellt, ob der Prozess noch laeuft. Das hat bis zur Umstellung auf SuSE8.0 hervorragend funktioniert. Der Skript sieht so aus: [...]
Ist sicher nicht die Lösung zu deinem Skript-Problem, aber sieh dir doch mal startproc¹ an. Martin ¹sysvinit.rpm, afaik gibts das bei SuSE 8.0 auch noch. - -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE9eKyTLpdxqCHuybARAkKiAKCrOjLnsx7CSfssWn182Pe+v5HqcgCfSqBX 9IhM+r3+2mcNe14v6H7jGtA= =ERGE -----END PGP SIGNATURE-----
participants (5)
-
B.Brodesser@t-online.de
-
David Haller
-
Jan.Trippler@t-online.de
-
Johannes Studt
-
Martin Borchert