6 Stimmen

Start des Java-Prozesses beim Booten und automatischer Neustart beim Tod

Ich habe zwei Anforderungen für meine Java-Anwendung. Wenn sie stirbt, starte sie neu. Wenn der Server neu startet, starte ihn neu - ganz einfach. Verwendung der Antwort aquí Ich habe ein Skript, das neu gestartet wird, wenn die Java-Anwendung stirbt.

#!/bin/bash

until java -Xms256m -Xmx768m -jar MyApp.jar; do
    echo "MyApp crashed with exit code $?.  Respawning... " >&2
    sleep 5
done

Ich kann dies mit "nohup restart_script.sh &" ausführen und es läuft den ganzen Tag lang ohne Probleme. Nun zur Startanforderung. Ich habe das /etc/init.d/crond-Skript genommen und die crond-Binärdatei durch mein Skript ersetzt, aber es bleibt beim Start hängen.

#!/bin/bash
#
# Init file for my application.
#
. /etc/init.d/functions

MYAPP=restart\_script.sh
PID\_FILE=/var/run/myapp.pid

start(){
        echo -n "Starting My App"
        daemon --user appuser $MYAPP
        RETVAL=$?
        echo
        \[ $RETVAL -eq 0 \] && touch /var/lock/subsys/myapp
        return $RETVAL
}

stop(){
        echo -n "Stopping my application"
        killproc $MYAPP
        RETVAL=$?
        echo
        \[ $RETVAL -eq 0 \] && rm -f /var/lock/subsys/myapp
        return $RETVAL
}

...

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
...
esac

Wenn ich /sbin/service myapp start ausführe, startet das Skript, aber die Konsole bleibt hängen. Ich habe es mit "daemon --user appuser nohup $MYAPP &" versucht und bin sofort zur Eingabeaufforderung zurückgekehrt, ohne eine [OK]-Anzeige, und wenn ich ein ps ausführe, sehe ich immer noch, dass das Init-Skript hängt. Hat jemand eine Idee, wie man ein Skript innerhalb des Init-Skripts aufruft und es dazu bringt, richtig zurückzukehren?

Danke,

Greg

10voto

R Samuel Klatchko Punkte 72641

Die Daemon-Funktion auf meinem Rechner (alter RedHat) kehrt erst zurück, wenn das ausgeführte Programm zurückkehrt. Sie müssen also Ihr kleines Hilfsskript das Forking durchführen lassen.

Versuchen Sie, Ihr Dienstprogramm so zu schreiben:

#!/bin/bash

(
    until java -Xms256m -Xmx768m -jar MyApp.jar; do
        echo "MyApp crashed with exit code $?.  Respawning... " >&2
        sleep 5
    done
) &

Wie das funktioniert. Wenn Sie einen Befehl in Klammern setzen, wird der Code in einem neuen Prozess ausgeführt. Sie stellen den Prozess in den Hintergrund, damit der ursprüngliche Prozess zurückkehrt, ohne auf ihn zu warten.

4voto

Teja Kantamneni Punkte 17179

Sie brauchen einen Java Service Wrapper, hier ist ein sehr guter... Marderhunde
Ich will damit sagen, dass man das Rad nicht neu erfinden muss, es gibt da draußen Werkzeuge.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X