2012-08-23 13 views
10

Estoy usando un jsvc nativo compilado para iniciar un daemon java. Estoy ejecutando esto en un openSUSE 32 bit vm. El código implementa la interfaz daemon de Apache y estoy ejecutando el comando deamon con el siguiente comando.Apache jsvc no puede detener a Daemon

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

Se inicia y funciona sin problemas. Puedo iniciar el daemon como un usuario normal y como root. Sin embargo, cuando voy a terminar el daemon, jsvc mata el proceso en lugar de emitir un comando de detención.

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

El proceso demonio muere, pero no ejecuta ninguna de sus etapas de apagado (por ejemplo, se debe registrar, marcar un registro en la base de datos, etc.). Me sale el siguiente en el archivo de logs/jsvc.err, y no escribe cualquier otro registros:

Service exit with return value 143 

Tras Google el error, estoy viendo un puñado de personas que todos han visto la misma cosa , pero en ninguna parte puedo encontrar una buena resolución (http://mail-archives.apache.org/mod_mbox/commons-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).

ACTUALIZACIÓN: Usando lanzador servicio de la ventana de Apache (procrun) Soy capaz de iniciar y detener el servicio sin ningún problema. El problema parece ser solo relacionado con jsvc, y solo al detener el daemon.

ACTUALIZACIÓN 2: Después de leer el http://commons.apache.org/daemon/jsvc.html#Starting_jsvc más detenidamente, me di cuenta de que la etiqueta de parada Estoy cuestiones utilizando un comando kill pn el proceso a través del archivo pid especifico. Parece que jsvc en realidad no detiene al daemon con gracia por diseño. Esto es consistente con el comportamiento que estoy viendo, ya que el método de parada muy detallado no está escribiendo ningún mensaje.

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

nuevas preguntas:

  • Si mi java principal ha implementado la interfaz Apache Daemon, ¿cómo puedo emitir un 'stop' en el demonio que se ejecuta?
  • ¿Necesito algo más que jsvc (que parece que solo es útil para iniciar o matar al daemon)?

Respuesta

5

Ah, ok. Resulta que el comando jsvc stop se comportaba correctamente. Tuve que profundizar en la forma en que los procesos reciben mensajes de terminación en Linux/Unix a través del comando kill. Jsvc emite un kill -15 (que es una muerte suave) en el daemon. Ver: http://commons.apache.org/daemon/ y http://en.wikipedia.org/wiki/Kill_(command) para la descripción de cómo los procesos de Unix reciben mensajes.

El verdadero problema estaba en la construcción del daemon. En mi método de inicio, el daemon se enlazó hasta que se emitió un comando de apagado, lo que impidió que el daemon renunciara al control como el proceso secundario daemon.

Tenía esta:

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

que debería haber tenido más abajo, para que pudiera regresar y permitir que el hilo de utilidad para recibir señales desde el sistema operativo. Consulte http://commons.apache.org/daemon/jsvc.html#How_jsvc_works, en particular la sección en: 'Proceso controlado:'

@Override 
public void start() 
{ 
    doStartWork(); 
} 
Cuestiones relacionadas