Hay una cosa crucial que debe hacer después de agregar un &
al final del comando. El proceso sigue vinculado a la terminal. Necesitas ejecutar disown
después de ejecutar el comando java.
java -jar yourApp.jar > log.txt &
disown
Ahora, puede cerrar la terminal.
Hay varias maneras de lograr tal cosa:
nohup java -server myApplication.jar > /log.txt
- Esto es bastante sencillo. Simplemente pondrá la aplicación en segundo plano. Esto funcionará, pero no es una buena forma de hacerlo.- Utilice un envoltorio de shell y la aplicación OR daemon anterior. Muchos proyectos de código abierto utilizan este enfoque y es bastante bueno para la mayoría de los escenarios. Adicionalmente se puede incluir 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. - Cree su propio servidor daemon utilizando 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 Tomcat usa el de Apache Commons! Además está Akuma.
Personalmente, elegiría la solución 2 o 3 si necesita usar este servidor en el futuro y/o distribuirlo a clientes, usuarios finales, etc. nohup
es bueno si necesita ejecutar algo y no tiene tiempo para desarrollar una solución más compleja para el problema.
Anuncio 2:
Los mejores scripts, utilizados por muchos proyectos, se pueden encontrar aquí.
Para Debian/Ubuntu se puede usar un script muy simple basado en start-stop-daemon
. En caso de duda hay /etc/init.d/skeleton
uno puede modificar.
#!/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