2012-08-23 7 views
10

Ich verwende eine native kompilierte jsvc, um einen Java-Daemon zu starten. Ich führe dies auf einem openSUSE 32 bit vm. Der Code implementiert Apache Daemon-Schnittstelle, und ich führe die Deamon mit dem folgenden Befehl.Apache jsvc kann Daemon nicht stoppen

./jsvc -home jre -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon 

Es beginnt und läuft ohne ein Problem. Ich kann den Daemon als normaler Benutzer und als root starten. Wenn ich jedoch den Daemon beenden möchte, beendet jsvc den Prozess und gibt keinen Stoppbefehl aus.

./jsvc -stop -home jre -outfile logs/jsvc.err -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon 

Der Daemon-Prozess stirbt, aber nicht jeder seiner Abschaltung Schritte ausführen (zum Beispiel, sollte es sich einzuloggen, markieren einen Datensatz in der db, etc). Ich werde im Anschluss an die in der logs/jsvc.err-Datei, und es schreibt keine andere Protokolle:

Service exit with return value 143 

Nach den Fehler googeln, ich eine Handvoll Leute bin zu sehen, die alle haben das Gleiche gesehen , aber nirgendwo kann ich eine gute Lösung finden (http://mail-archives.apache.org/mod_mbox/common-dev/200401.mbox/%[email protected] es% 3E, http://www.tek-tips.com/viewthread.cfm?qid=1014679, http://threebit.net/mail-archive/tomcat-users/msg03832.html).

UPDATE: Apache Fenster Service-Launcher (procrun) Ich kann den Service ohne Probleme starten und zu stoppen. Das Problem scheint nur mit jsvc verbunden zu sein und nur beim Stoppen des Daemon.

UPDATE 2: Nach dem http://commons.apache.org/daemon/jsvc.html#Starting_jsvc sorgfältiger Lektüre, bemerkte ich, dass der Anschlag TAGi ich Probleme einen Kill-Befehl pn den Prozess über die pid-Datei angeben bin mit. Es scheint, dass jsvc den Daemon eigentlich nicht vom Design abhält. Dies ist konsistent mit dem Verhalten, das ich sehe, da die sehr ausführliche Stop-Methode keine Nachrichten ausgibt.

-stop  stop the service using the file given in the -pidfile option 

Neue Fragen:

  • Wenn mein Java-Haupt-Apache Daemon Schnittstelle implementiert hat, wie ich eine Ausgabe von 'Stop' auf dem laufenden Daemon?
  • Benötige ich etwas anderes als jsvc (das scheint nur nützlich zu sein, um den Daemon zu starten oder zu beenden)?

Antwort

5

Ah, ok. Es stellt sich heraus, dass der Befehl jsvc stop sich korrekt verhält. Ich musste herausfinden, wie Prozesse in Linux/Unix mit dem Befehl kill beendet werden. Jsvc gibt einen kill -15 (was ein Soft-Kill ist) auf dem Daemon aus. Siehe: http://commons.apache.org/daemon/ und http://en.wikipedia.org/wiki/Kill_(command) für die Beschreibung, wie Unix-Prozesse Nachrichten empfangen.

Das eigentliche Problem war in der Konstruktion des Daemon. In meiner Startmethode lief der Daemon solange, bis ein Befehl zum Herunterfahren ausgegeben wurde, der verhinderte, dass der Daemon die Kontrolle als Daemon-Child-Prozess aufgab.

Ich hatte dies:

@Override 
public void start() 
{ 
    doStartWork(); 
    while (isAlive()) 
    { 
     Thread.sleep(1000); 
    } 
} 

ich unten gehabt haben sollte, so konnte ich dem Dämon Thread zu empfangen Signale von den OS zurückzukehren und ermöglichen. Siehe http://commons.apache.org/daemon/jsvc.html#How_jsvc_works, speziell der Abschnitt unter: 'Kontrollierter Prozess:'

@Override 
public void start() 
{ 
    doStartWork(); 
} 
Verwandte Themen