2012-02-24 28 views
22

He desarrollado una conexión de servidor de socket Java que funciona bien.Proceso de fondo en Linux

Cuando se inicia desde un terminal, comienza por escuchar desde el cliente. Pero cuando cierro el terminal deja de escuchar.

Necesito continuar aunque el terminal se cerró por el usuario desde donde se inició el archivo jar.

¿Cómo puedo ejecutar la aplicación de socket del servidor Java en Linux como proceso en segundo plano?

+0

http://stackoverflow.com/questions/2151214/is-it-possible-to-double-fork-a-process-in-java – tMC

Respuesta

30

Hay varias maneras de lograr tal cosa:

  1. nohup java -server myApplication.jar > /log.txt - esto es bastante sencillo. Simplemente colocará la aplicación en segundo plano. Esto funcionará, pero simplemente no es una muy buena manera de hacerlo.
  2. Utilice una envoltura de shell y la aplicación O daemon anterior. Este enfoque es utilizado por muchos proyectos de código abierto y es bastante bueno para la mayoría de los escenarios. Además, puede incluirse en init.d y el nivel de ejecución requerido con comandos regulares de inicio, parada y estado. Puedo proporcionar un ejemplo si es necesario.
  3. Crea tu propio servidor daemon usando Java Service Wrapper o Apache Jakarta Commons Daemon. Nuevamente, ambos son extremadamente populares, bien probados y confiables. ¡Y disponible tanto para Linux como para Windows! ¡El servidor de Tomcat utiliza el de Apache Commons! Además, está Akuma.

Personalmente me gustaría ir con una solución de 2 o 3 si es necesario utilizar este servidor en el futuro y/o distribuirlo a los clientes, usuarios finales, etc. nohup es bueno si necesita ejecutar algo y no tienen tiempo para desarrollar una solución más compleja para el problema.

del anuncio 2:

Los mejores guiones, utilizado por muchos proyectos, se puede encontrar here.

Para Debian/Ubuntu se puede usar un script muy simple basado en start-stop-daemon. Si tiene dudas, puede modificar /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

Gracias Rzanek por la respuesta. Quiero ir con la opción 2. Si me puede dar un ejemplo. – user861973

1

¿Intentó poner & al final de la línea de comando? Por ejemplo:

java -jar mySocketApp.jar & 

También puede utilizar bg y fg comandos para enviar un proceso de fondo y primer plano. Puede pausar el proceso en ejecución por CTRL + Z.

Compruebe hacia fuera este artículo: http://lowfatlinux.com/linux-processes.html

1

intento,

java -jar yourApp.jar & 

& comenzará hilo nuevo proceso, no he probado esto, pero si todavía no funciona, entonces Twite que en el archivo de secuencia de comandos y comience con &

5

Hay una cosa crucial que debe hacer después de agregar un & al final del comando. El proceso todavía está vinculado a la terminal. Debe ejecutar disown después de ejecutar el comando java.

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

Ahora, puede cerrar el terminal.

+1

ese comando no funcionó para mí, necesitaba 'java -jar yourApp .jar> log.txt & 'usando ubuntu, no' & 'al final – wired00

3

La frase clave que necesita aquí es "daemonizing a process". ¿Alguna vez se preguntó por qué los procesos del servidor del sistema a menudo terminan en 'd' en Linux/Unix? La 'd' significa 'daemon', por razones históricas.

Por lo tanto, el proceso de separación y convertirse en un verdadero proceso de servidor se denomina "daemonización".

Es completamente general, y no se limita solo a los procesos de Java.

Hay varias tareas que debe hacer para convertirse en un proceso de daemon verdaderamente independiente. Están listados en la página de Wikipedia.

Las dos cosas principales que usted necesita preocuparse por son:

  • Separar del proceso padre
  • se desprenden de la terminal a la que creó el proceso

Si google la frase "daemonizing una proceso ", encontrará varias maneras de lograr esto y algunos detalles más sobre por qué es necesario.

La mayoría de las personas simplemente usaría un pequeño script de shell para iniciar el proceso de java, y luego terminar el comando java con un '&' para iniciar en modo de fondo. Luego, cuando finaliza el proceso de script de inicio, el proceso de java aún se está ejecutando y se separará del proceso de script ahora está muerto.

Cuestiones relacionadas