2009-04-14 1 views
0

Wir haben einen Jboss-Anwendungsserver, der eine Webanwendung ausführt. Wir müssen irgendwo auf der Benutzeroberfläche eine Schaltfläche "Neustart" implementieren, die den Neustart des gesamten Anwendungsservers zur Folge hat. Unsere naive Implementierung bestand darin, unser Skript /etc/init.d mit dem Neustartbefehl aufzurufen. Dadurch wird unser Anwendungsserver heruntergefahren und neu gestartet.Kann Java ein Skript aufrufen, um Java in Solaris neu zu starten?

Es scheint jedoch, dass wenn der Java-Prozess heruntergefahren wird, auch der untergeordnete Prozess, der die Neustart-Skripts ausführt, stirbt, bevor er an den Punkt im Skript gelangt, an dem er den Anwendungsserver erneut startet.

Wir haben versucht, '&' an den Stellen, an denen Skripte aufgerufen werden, zu ändern, aber das hat nicht geholfen. Gibt es etwas, wo man das Script feuern und sterben kann, ohne den Script-Prozess zu zerstören?

+0

Ein anderer Ansatz könnte darin bestehen, init.d so zu konfigurieren, dass der Anwendungsserver beim Stoppen neu gestartet wird. Sie müssen dann nur die JVM herunterfahren und Solaris erneut starten lassen. –

Antwort

1

Verwenden Sie den Befehl nohup, um etwas aus dem Skript auszuführen, das Sie über Java ausführen. Das heißt, wenn das Skript, das Sie von Java ausführen zur Zeit läuft dies:

/etc/init.d/myservice restart 

dann ändern Sie es, dies zu tun:

nohup /etc/init.d/myservice restart 

außerdem sicher, dass Sie NICHT stdin, stdout oder stderr haben DO vom Java-Prozess abgefangen werden. Dies könnte potentiell zu Problemen führen. So vielleicht versuchen, diese (vorausgesetzt, bash oder sh):

nohup /etc/init.d/myservice restart >/dev/null 2>&1 
+0

Das würde wohl in manchen Fällen funktionieren, aber leider nicht von uns. Unser Serverprozess selbst wurde mit nohup gestartet. Um es zu stoppen, müssen wir SIGINT oder SIGTERM senden. Und diese verbreiten sich trotz des nohup bis zum Restart-Skript. Es ist ein Catch-22. –

0

Stellen Sie Ihre Signal-Handler in dem Restart-Skript Ihr Signal mit Fall zu ignorieren:

trap "" 2 # ignore SIGINT 
trap "" 15 # ignore SIGTERM 

Nachdem dies zu tun, müssen Sie Töte dein Restart-Skript bei Bedarf mit einem anderen Signal, wahrscheinlich SIGKILL.