2012-08-23 19 views
10

Sto utilizzando un jsvc nativo compilato per avviare un daemon java. Sto facendo funzionare questo su un VM di openSUSE a 32 bit. Il codice implementa l'interfaccia demone di Apache e sto eseguendo il demone con il seguente comando.Apache jsvc non interrompe il daemon

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

Si avvia e funziona senza problemi. Posso avviare il demone come utente normale e come root. Tuttavia, quando vado a terminare il demone, jsvc uccide il processo anziché emettere un comando di stop.

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

Il processo demone muore, ma non esegue una qualsiasi delle sue fasi di arresto (per esempio, dovrebbe registrare, segnare un record nel db, ecc). Ottengo il seguente nel file logs/jsvc.err, e non scrivere alcun altri registri:

Service exit with return value 143 

Dopo googling l'errore, sto vedendo una manciata di persone che tutti hanno visto la stessa cosa , ma da nessuna parte posso trovare una buona risoluzione (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).

UPDATE: Utilizzando servizio di avvio della finestra di Apache (procrun) sono in grado di avviare e interrompere il servizio senza problemi. Il problema sembra essere solo relativo a jsvc e solo all'arresto del demone.

UPDATE 2: Dopo aver letto il http://commons.apache.org/daemon/jsvc.html#Starting_jsvc con più attenzione, ho notato che il tag fermata sto usando emette un comando kill pn il processo tramite il file pid specificata. Sembra che jsvc in realtà non fermi il demone con grazia in base alla progettazione. Questo è coerente con il comportamento che sto vedendo, poiché il metodo di interruzione molto verboso non sta scrivendo alcun messaggio.

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

Nuove domande:

  • Se la mia principale Java ha implementato l'interfaccia Apache Daemon, come faccio a emettere un 'stop' sul demone di esecuzione?
  • Ho bisogno di qualcosa di diverso da jsvc (che sembra sia utile solo per avviare o uccidere il demone)?

risposta

5

Ah, ok. Si scopre che il comando stop di jsvc si stava comportando correttamente. Ho dovuto scavare nel modo in cui i processi ricevono i messaggi di terminazione in Linux/Unix tramite il comando kill. Jsvc emette un kill -15 (che è un soft kill) sul demone. Vedere: http://commons.apache.org/daemon/ e http://en.wikipedia.org/wiki/Kill_(command) per la descrizione di come i processi unix ricevono messaggi.

Il vero problema era nella costruzione del demone. Nel mio metodo di avvio, il daemon ha eseguito il ciclo fino a quando non è stato emesso un comando di arresto, che ha impedito al demone di rinunciare al controllo mentre il processo figlio daemon.

ho avuto questo:

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

avrei avuto seguito, così ho potuto tornare e consentire al thread demone per ricevere i segnali dal sistema operativo. Vedere http://commons.apache.org/daemon/jsvc.html#How_jsvc_works, in particolare la sezione sotto: "Processo controllato:"

@Override 
public void start() 
{ 
    doStartWork(); 
} 
Problemi correlati