He escrito una aplicación de servidor Java que se ejecuta en una solución Linux alojada virtual estándar. La aplicación se ejecuta todo el tiempo escuchando conexiones de socket y creando nuevos controladores para ellas. Es una implementación del lado del servidor para una aplicación cliente-servidor.
La forma en que lo inicio es incluyéndolo en el script de inicio rc.local del servidor. Sin embargo, una vez iniciado, no sé cómo acceder para detenerlo y si deseo instalar una actualización, entonces tengo que reiniciar el servidor para reiniciar la aplicación.
En una PC con Windows, para este tipo de aplicación, podría crear un servicio de Windows y luego puedo detenerlo e iniciarlo como quiera. ¿Hay algo así en una caja de Linux para que si inicio esta aplicación pueda detenerla y reiniciarla sin hacer un reinicio completo del servidor?
Mi aplicación se llama WebServer.exe. Se inicia al iniciar el servidor incluyéndolo en mi rc.local como tal:
java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &
Soy un poco novato en Linux, por lo que cualquier ejemplo sería apreciado con cualquier publicación. Sin embargo, tengo SSH y acceso FTP completo a la caja para instalar cualquier actualización, así como acceso a un panel Plesk.
Una solución simple es crear un script start.sh que ejecute Java a través de nohup y luego almacene el PID en un archivo:
Luego, su script de detención stop.sh leería el PID del archivo y cerraría la aplicación:
Por supuesto, he omitido algunos detalles, como verificar si el proceso existe y eliminarlo
pid.txt
si ha terminado.fuente
El script de inicio del servicio de Linux se almacena en
/etc/init.d
. Puede copiar y personalizar el/etc/init.d/skeleton
archivo y luego llamarver http://www.ralfebert.de/blog/java/debian_daemon/ . Es para Debian (entonces, Ubuntu también) pero se ajusta a una mayor distribución.
fuente
Tal vez no sea la mejor solución de desarrollo de operaciones, pero es bueno para el uso general de un servidor para una fiesta de LAN o similar.
Use
screen
para ejecutar su servidor y luego desconecte antes de cerrar sesión, esto mantendrá el proceso en ejecución, luego puede volver a adjuntarlo en cualquier momento.Flujo de trabajo:
Comience una pantalla:
screen
Inicia tu servidor:
java -jar minecraft-server.jar
Detach pulsando:
Ctl-a
,d
Vuelva a colocar:
screen -r
Más información aquí: https://www.gnu.org/software/screen/manual/screen.html
fuente
Otra alternativa, que también es bastante popular, es el Java Service Wrapper . Esto también es bastante popular en la comunidad OSS.
fuente
Refiriéndome también a la aplicación Spring Boot como Servicio , elegiría la
systemd
versión, ya que es la más fácil, menos detallada y mejor integrada en las distribuciones modernas (e incluso las no tan modernas como CentOS 7.x).fuente
La forma más fácil es usarlo
supervisord
. Vea los detalles completos aquí: http://supervisord.org/Más información:
/ubuntu/779830/running-an-executable-jar-file-when-the-system-starts/852485#852485
https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps
fuente
Aquí hay un script de shell de muestra (asegúrese de reemplazar el nombre MATH con el nombre de su aplicación):
fuente
Desde la aplicación Spring Boot as a Service , puedo recomendar la
supervisord
aplicación basada en Python . Vea esa pregunta de desbordamiento de pila para obtener más información. Es realmente sencillo de configurar.fuente
supervisord
es genial, para aquellos que no lo saben, permite servicios de monitoreo (que deben serforeground
- nodaemonized
), luego reiniciará automáticamente los servicios (y puede enviar alertas por correo electrónico cuando se reinicien a través de complementos)Otras respuestas hacen un buen trabajo al proporcionar scripts y configuraciones personalizadas dependiendo de su plataforma. Además de esos, aquí están los programas maduros de propósito especial que conozco:
fuente
Puede usar el servidor Thrift o JMX para comunicarse con su servicio Java.
fuente
De Spring Boot Reference Guide
Continúe leyendo para saber cómo asegurar un servicio implementado.
Después de hacer lo escrito, descubrí que mi servicio no puede iniciarse con este mensaje de error en los registros: start-stop-daemon: opción no reconocida --no-close . Y he logrado solucionarlo creando un archivo de configuración
/var/myapp/myapp.conf
con el siguiente contenidofuente
Tengo una aplicación Netty java y quiero ejecutarla como un servicio con systemd. Lamentablemente, la aplicación se detiene sin importar el tipo que esté usando. Al final he envuelto java start en pantalla. Aquí están los archivos de configuración:
Servicio
comienzo
desde ese punto puedes usar
systemctl [start|stop|status] service
.fuente
Para ejecutar código Java como daemon (servicio), puede escribir código auxiliar basado en JNI.
http://jnicookbook.owsiak.org/recipe-no-022/
para un código de muestra basado en JNI. En este caso, daemoniza el código que se inició como Java y el bucle principal se ejecuta en C. Pero también es posible poner el bucle de servicio principal, daemon, dentro de Java.
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo029
Diviértete con JNI!
fuente
Puede escribir una secuencia de comandos de detención simple que haga greps para su proceso de Java, extraiga el PID y llame a kill en él. No es lujoso, pero es sencillo. Algo así puede ser de ayuda como comienzo:
fuente
pkill nameofprocess
hago lo mismo?Es posible ejecutar la guerra como un servicio de Linux, y es posible que desee forzar su archivo pom.xml antes de empaquetarlo, ya que algunas distribuciones pueden no reconocerse en modo automático. Para hacerlo, agregue la siguiente propiedad dentro del complemento spring-boot-maven-plugin.
Luego, configure su init.d con:
y podrás correr
Hay muchas otras opciones que puede encontrar en la documentación de Spring Boot , incluido el servicio de Windows.
fuente