Ejecute el archivo jar de Java en un servidor como proceso en segundo plano

105

Necesito ejecutar un jar de Java en el servidor para comunicarme entre dos aplicaciones. He escrito dos scripts de shell para ejecutarlo, pero una vez que inicio ese script, no puedo cerrar / terminar el proceso. Si presiono ctrl+ Co cierro la consola, el servidor se apagará. ¿Alguien podría ayudarme a modificar este script para que se ejecute como un servidor normal?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid
Bernad Ali
fuente

Respuestas:

242

Puedes probar esto:

#!/bin/sh
nohup java -jar /web/server.jar &

El símbolo & cambia el programa para que se ejecute en segundo plano.

La utilidad nohup hace que el comando pasado como argumento se ejecute en segundo plano incluso después de cerrar la sesión.

Anton Beloglazov
fuente
Gracias Anton, actualmente estoy deteniendo el servidor eliminando la identificación del proceso. No creo que sea la mejor práctica. ¿Hay un comando para detener el servidor?
Bernad Ali
3
Respuesta corta: depende del servidor. Respuesta larga: hasta donde yo sé, no existe una forma segura de cerrar un proceso sin que el proceso admita cierres tan elegantes. Por ejemplo, si se trata de un servidor web que está siendo terminado por una señal externa, siempre existe la posibilidad de que se pierdan algunas solicitudes. Una forma de resolver este problema es implementar una función de terminación elegante en el propio servidor, por ejemplo, procesando un tipo especial de solicitudes. Luego, el servidor puede terminarse enviándole una solicitud de ese tipo especial. De lo contrario, matar el proceso por su ID es la forma más sencilla.
Anton Beloglazov
1
El uso nohupsiempre debe combinarse con la redirección de stdout y stderr explícitamente; de ​​lo contrario, no obtendrá control de dónde van los registros y terminará con un feo nohup.outcreado en cualquier directorio desde el que se invoque este script.
Charles Duffy
@Anton cuando ejecuto un script (como su respuesta) con SSH EXEC runjar.sh. Comenzó a transmitir los registros en mi terminal local y, si cierro mi terminal, mi jar se mata. ¿Cómo puedo ejecutar un jar en segundo plano usando SSH EXEC?
AATHITH RAJENDRAN
47

Systemd que ahora se ejecuta en la mayoría de distribuciones

Paso 1:

Encuentra tus servicios definidos por el usuario en los que estaba el mío /usr/lib/systemd/system/

Paso 2:

Cree un archivo de texto con su nombre de editor de texto favorito whatever_you_want.service

Paso 3:

Ponga la siguiente plantilla en el archivowhatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

Paso 4:

Ejecute su servicio
como superusuario

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service
mtelesha
fuente
Esta es la forma moderna de hacerlo
EarthMind
4
en la imagen de aws ubutnu tuve que instalar systemd y luego encontré la imagen en / etc / systemd / system /
Robbo_UK
29

Si está usando Ubuntu y tiene "Upstart" ( http://upstart.ubuntu.com/ ) puede probar esto:

Crear /var/init/yourservice.conf

con el siguiente contenido

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

Ahora puede emitir los comandos service yourservice starty service yourservice stop. Puede seguir /var/log/yourservice.logpara verificar que está funcionando.

Si solo desea ejecutar su jar desde la consola sin que acapare la ventana de la consola, puede hacer lo siguiente:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1
Strelok
fuente
3
¿Es un servicio de systemd? Esta pregunta no está etiquetada como linux, y muy pocas distribuciones tienen systemd por defecto.
Jordanm
1
Enmendaré la pregunta para decir que se usa "advenedizo" que se incluye en ubuntu.
Strelok
1
Creo que, como último consejo, si quieres que se ejecute en segundo plano y se libere el shell, debes hacer: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro
Todos los trabajos del sistema por defecto se encuentran en el siguiente directorio: / etc / init / ... Por defecto, no hay directorio / var / init / en Ubuntu 14.04.
Michael Lafayette
Además, iniciar un servicio requiere "sudo". servicio sudo inicio de servicio
Michael Lafayette
2

Ejecute en segundo plano y agregue registros al archivo de registro utilizando lo siguiente:

nohup java -jar /web/server.jar > log.log 2>&1 &
KayV
fuente