Script weiterlaufen lassen nach 'exec'

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
rahab
Beiträge: 165
Registriert: 24.09.2002 12:04:05

Script weiterlaufen lassen nach 'exec'

Beitrag von rahab » 14.12.2004 13:01:57

Hallo Forum,

Hab ein kleines Problem mit dem Tomcat-Applicationserver:
Wenn ich ihn über das Standardscript stoppe bleiben gelegentlich JAVA-Threads hängen.
Daher hab ich mir das Script catalina.sh entsprechend modifiziert, so dass nochmal explizit der Prozess via kill abgeschossen wird.
Auszug:

Code: Alles auswählen

elif [ "$1" = "stop" ] ; then
  shift
  exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Bootstrap "$@" stop

###################
PID= `cat /tmp/tomcat.pid`
echo $PID
sleep 5
/bin/kill -9 $PID
/bin/rm /tmp/tomcat.pid
###################
Den Teil in in den Rauten hab ich ergänzt, nur leider wird der nach dem 'exec' nicht mehr ausgeführt, egal ob der Server korrekt gestoppt hat oder garnicht gestartet war. Wie kann ich das Script so gestalten, dass es nach dem 'exec' noch weiterläuft ?
Gibts eine art 'resume next' ? :wink:

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Script weiterlaufen lassen nach 'exec'

Beitrag von gms » 14.12.2004 13:54:38

rahab hat geschrieben: Gibts eine art 'resume next' ? :wink:
nein, exec ersetzt die current shell ohne einen neuen prozess zu erstellen.


einfachste lösung:
exec entfernen und nach deinem /bin/rm /tmp/tomcat.pid ein exit einbauen

Benutzeravatar
rahab
Beiträge: 165
Registriert: 24.09.2002 12:04:05

Beitrag von rahab » 14.12.2004 14:18:04

OK,
danke schonmal für die Antwort.

Noch eine Frage dazu:
Besagte catalina.sh wird wiederum von einem Script aufgerufen.
Bricht dieses nun auch quasi an der Stelle des Aufrufes von catalina.sh ab, da in der catalina.sh das exec steht? oder könnte ich in dem übergeordneten Script einen Aufruf vom Format 'catalina.sh stop && kill -15 `cat /tmp/tomcat.pid` verwenden.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 14.12.2004 15:17:17

Deine Lösung sollte eigentlich funktionieren, wenn catalina.sh eine neue Shell bekommt.
Anders ausgedrückt, wenn catalina.sh nicht mit dem Punkt+Abstand aufgerufen wird, etwa so:

Code: Alles auswählen

.  <path>/catalina.sh stop

Benutzeravatar
rahab
Beiträge: 165
Registriert: 24.09.2002 12:04:05

Beitrag von rahab » 14.12.2004 17:19:04

Super, danke

hab jetzt alles soweit und es funktioniert auch gut.
Nur würde ich jetzt noch gerne vor dem Killen checken, ob der Prozess mit der ausgelesenen PID auch wirklich noch läuft und ihn nur dann killen.
Sonst gibt´s ja ne Fehlermeldung vom 'kill'.

Hast du da ne gute Methode, die ich im Script benutzen kann ?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 14.12.2004 17:46:17

zum Beispiel so:

Code: Alles auswählen

ps -ef | grep $PID | grep -v grep || kill -9 $PID
oder einfacher

Code: Alles auswählen

kill -9 $PID 2>/dev/null
[code]

Benutzeravatar
rahab
Beiträge: 165
Registriert: 24.09.2002 12:04:05

Beitrag von rahab » 14.12.2004 18:00:09

Danke nochmal für die Hilfe !!!

Meine Lösung sieht jetzt so aus:

Code: Alles auswählen

TEST=`ps -A | grep $PID | awk '{ print $1 }'`
if [ "$TEST" = $PID ]; then
        /bin/kill -9 $PID 2>&1 >> $logfile
	echo "ACHTUNG: Tomcat musste hart gekillt werden!" >> $logfile
else
	echo "Tomcat wurde sauber gestoppt." >> $logfile
fi
Ist auch ganz brauchbar denke ich

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 14.12.2004 18:13:17

du hast recht, mein grep wahr ziemlich unsicher formuliert :oops:

so ginge es aber auch:

Code: Alles auswählen

if ps -A | grep "^$PID "; then
  /bin/kill -9 $PID 2>&1 >> $logfile 
  echo "ACHTUNG: Tomcat musste hart gekillt werden!" >> $logfile 
else 
  echo "Tomcat wurde sauber gestoppt." >> $logfile 
fi  

Antworten