![](https://seccdn.libravatar.org/avatar/735ea797d876adb026ae955e8adbf597.jpg?s=120&d=mm&r=g)
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