2012-02-24 14 views
22

Ho sviluppato una connessione server socket Java che funziona correttamente.Processo in background in linux

Quando avviato da un terminale, inizia dall'ascolto dal client. Ma quando chiudo il terminale smette di ascoltare.

Devo continuare anche se il terminale è stato chiuso dall'utente da dove è stato avviato il file jar.

Come è possibile eseguire l'applicazione socket del server Java in Linux come processo in background?

+0

http://stackoverflow.com/questions/2151214/is-it-possibile-per-doppi-fork-a-processo-in-java – tMC

risposta

30

Ci sono diversi modi per ottenere una cosa del genere:

  1. nohup java -server myApplication.jar > /log.txt - questo è abbastanza semplice. Metterà l'applicazione in secondo piano. Funzionerà ma non è un ottimo modo per farlo.
  2. Utilizzare un wrapper di shell e l'applicazione O daemon sopra. Questo approccio è utilizzato da molti progetti open source ed è abbastanza buono per la maggior parte degli scenari. Inoltre può essere incluso in init.d e il livello di esecuzione richiesto con i normali comandi di avvio, arresto e stato. Posso fornire un esempio se necessario.
  3. Crea il tuo server daemon utilizzando Java Service Wrapper o Apache Jakarta Commons Daemon. Ancora una volta - entrambi sono estremamente popolari, ben collaudati e affidabili. E disponibile per Linux e Windows! Quello di Apache Commons è usato dal server Tomcat! Inoltre c'è Akuma.

Personalmente vorrei andare con una soluzione di 2 o 3 se è necessario utilizzare questo server in futuro e/o distribuirlo ai client, gli utenti finali, ecc nohup è buono se avete bisogno di eseguire qualcosa e non hanno tempo per sviluppare una soluzione più complessa per il problema.

Ad 2:

Le migliori script, utilizzato da molti progetti, può essere trovato here.

Per Debian/Ubuntu uno può utilizzare uno script molto semplice basato su start-stop-daemon. In caso di dubbi, è possibile modificare /etc/init.d/skeleton.

#!/bin/sh 

DESC="Description" 
NAME=YOUR_NAME 
PIDFILE=/var/run/$NAME.pid 
RUN_AS=USER_TO_RUN 
COMMAND=/usr/bin/java -- -jar YOUR_JAR 

d_start() { 
    start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --exec $COMMAND 
} 

d_stop() { 
    start-stop-daemon --stop --quiet --pidfile $PIDFILE 
    if [ -e $PIDFILE ] 
     then rm $PIDFILE 
    fi 
} 

case $1 in 
    start) 
    echo -n "Starting $DESC: $NAME" 
    d_start 
    echo "." 
    ;; 
    stop) 
    echo -n "Stopping $DESC: $NAME" 
    d_stop 
    echo "." 
    ;; 
    restart) 
    echo -n "Restarting $DESC: $NAME" 
    d_stop 
    sleep 1 
    d_start 
    echo "." 
    ;; 
    *) 
    echo "usage: $NAME {start|stop|restart}" 
    exit 1 
    ;; 
esac 

exit 0 
+0

Rzanek Grazie per la risposta. Voglio andare con l'opzione 2. Se puoi fornirmi un esempio. – user861973

1

Forse si tenta di mettere & alla fine della riga di comando? Per esempio:

java -jar mySocketApp.jar & 

È inoltre possibile utilizzare bg e fg comandi per inviare un processo di sfondo e primo piano. È possibile sospendere il processo in esecuzione tramite CTRL + Z.

Check it out questo articolo: http://lowfatlinux.com/linux-processes.html

1

tentativo,

java -jar yourApp.jar & 

& inizierà nuovo thread di processo, non ho ancora testato questo, ma se ancora non funziona allora Twite nel file di script e avvia i con &

5

C'è una cosa fondamentale che devi fare dopo aver aggiunto un & alla fine del comando. Il processo è ancora collegato al terminale. È necessario eseguire disown dopo aver eseguito il comando java.

java -jar yourApp.jar > log.txt & 
disown 

Ora è possibile chiudere il terminale.

+1

che il comando non ha funzionato per me mi serviva 'java -jar yourApp .jar> log.txt & 'usando ubuntu, non' & 'alla fine – wired00

3

La frase chiave è necessario qui è "daemonizing un processo". Vi siete mai chiesti perché i processi del server di sistema spesso finiscono in "d" su Linux/Unix? La "d" sta per "demone", per ragioni storiche.

Quindi, il processo di distacco e di diventare un vero processo del server è chiamato "demonizzazione".

È completamente generale e non limitato ai soli processi Java.

Ci sono diverse attività che è necessario eseguire per diventare un processo demone veramente indipendente. Sono elencati nella pagina di Wikipedia.

Le due cose principali è necessario preoccuparsi sono:

  • Stacca dal processo genitore
  • staccarsi dalla tty che ha creato il processo

Se google la frase "daemonizing un processo ", troverete un sacco di modi per realizzare questo, e alcuni più dettagli sul motivo per cui è necessario.

La maggior parte delle persone utilizza semplicemente un piccolo script di shell per avviare il processo java e quindi completa il comando java con un '&' per l'avvio in modalità background. Quindi, quando il processo di script di avvio termina, il processo java è ancora in esecuzione e verrà rimosso dal processo di script ormai morto.

Problemi correlati