style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Start / Stop a una aplicacion

Hola !!!

Si alguien me puede ayudar, quiero realizar un programa que le envies parametros desde la linea de comandos, ejemplo:

java -jar MyApp start
java -jar MyApp stop

y obviamente se tiene que iniciar y parar, para iniciarlo no hay ningun problema, pero no se como pararlo, alguien me podria guiar por el buen camino

Nota:
el programa sera un socket que este escuchando y sera usado en ubuntu, centos y solaris.

Gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de benek

Daemon/Shell script

Podrías hacer un shell script que inicie y detenga tu aplicación y ponerlo bajo rc, para que funcione como demonio.

También pudes ocupar algo como Java Service Wrapper para facilitarte las cosas ya que hace precisamente eso, la versión "Community" cubre la funcionalidad básica de un daemon.

Saludos!

Javier Ramírez Jr.
http://twitter.com/_benek

Imagen de ezamudio

stop

java -jar cualquiercosa.jar va a arrancar una JVM que tenga como classpath cualquiercosa.jar y dentro del MANIFEST.MF del jar se indica la clase que contiene el método main() que hay que ejecutar. Si después del jar indicas parámetros, son los que se pasan en el arreglo de strings al main().

Así pues, java -jar MyApp.jar start iniciará el programa MyApp.jar corriendo el main de la clase que se indique en el manifiesto de MyApp.jar pasando "start" como parámetro al main(), mientras que java -jar MyApp.jar stop iniciará otro programa MyApp.jar idéntico (pero es un proceso separado) que recibirá "stop" como parámetro en el main().

Si necesitas un proceso de shutdown en tu programa y no tiene interfaz gráfica, puedes simplemente registrar un proceso que se ejecute cuando se le da shutdown a la JVM. Necesitas tener un Runnable o un Thread con el código que vas a ejecutar, y entonces:

Runnable miObjetoConCodigoParaShutdown;
Runtime.getRuntime().addShutdownHook(new Thread(miObjetoConCodigoParaShutdown, "mi-propio-shutdown"));

Y cuando quieras dar de baja tu programa, simplemente ubica el proceso y dale kill (pero sin -9 ni nada de eso). Puedes encontrarlo rápido con el programa jps que es similar a ps pero solamente te muestra los procesos de Java, con su número y la clase principal de cada uno:

$ jps
12345 MyApp
18495 OtraClase
$ kill 12345
Imagen de skuarch

Gracias benek

Ya no recordaba esa libreria, gracias por recordarmela, voy a checarla

Otra opción ( más compleja

Otra opción ( más compleja y quizá innecesaria ) es que tu programa, abra un socket y esté esperando a que alguién le diga que se muera.

La opción stop puede conectarse a ese nodo único y matarlo.

Algo como:

class YouApp {
     public static void main( String [] args ) {
           if( "start".equals(args[0] ) ) {
                 startApp(); // crea un server socket y deja el programa corriendo
           } else if ("stop".equals(args[0])) {
                Socket stopit = new Socket( localhost, 9876 ); // algún puerto predefinido.
                // sendInstruction( stopIt )  puedes mandarle una comando o algo
                // o simplemente cuando alguién se conecte cerrar la app
               .... cerrar y todo lo demás
          }
          private void startApp() {
               Server socket = new ServerSocket( 9876 );
               etc. etc. etc.
           }
}

Bueno la idea es esa, que tu programa, abra un socket y espere a que otra instancia de ese mismo programa se conecte y le diga que lo cierre. Puedes hacerlo extra sencillo, cerrando apenas alguien se conecte ( incluso puede cerrarlo desde otra máquina etc. )

O puedes meterle un poco más de seguridad creando un mini protocolo.

Es probable que ya haya algún framework para hacer esto.

Imagen de ezamudio

socket

Si el programa se cierra apenas alguien se conecte, un simple escaneo de puertos va a tronar el programa (nmap por ejemplo). Es mejor esperar un cierto comando, algo no obvio, y revisar además que la conexión provenga de 127.0.0.1 (a menos que quieras poder cerrar tu programa desde otro equipo).

el problema es demasiado sencillo como para ameritar un framework. Lo que probablemente sí haya son librerías para poder aceptar comandos a través de un socket, pero el intérprete siempre va a quedar de tu lado.

Yo propuse lo del shutdown hook porque los sistemas operativos donde piensan correr el programa son todos *nix y es fácil mandarles un kill.

@ezamudio: Yeap, tambien

@ezamudio: Yeap, tambien puedes matar el proceso con telnet localhost 9876 Depende de la complejidad deseada puedes dejarlo así y toma 10 minutos hacerlo o, puedes hacer un protocolo donde los datos vayan encriptados.

Imagen de skuarch

ShutDownHook

hola @ezamudio

los shutdownhook que yo utilizo son para mostrar un mensaje antes de que el programa termine, y no he tenido tiempo de investigar si sirven para otra cosa, deja lo checo bien y te comanto que onda

gracias por tu sugerencia !!!!

Imagen de skuarch

Socket para cerrar

Fijate que es una buen idea !!!

como comenta @ezamudio cada vez que haces el comando java -jar se creara una maquina virtual, entonces se me ocurrio con los que tu dices lo siguiente...

Cuando inicie el programa java java -jar myApp start se creara una maquina virtual que iniciara el programa normalmente y crearia un socket, un input y un output.
Cuando quiera pararlo seria de esta forma java -jar myApp stop se crearia una segunda maquina virtual que se conectaria a la primera y le mandara un comando "stop" mediante sockets y en la primer maquina virtual haria un Thread.currentThread().interrupt() o algo asi.

no suena tan mal y eso podria usarse en cualquier sistema operativo

gracias por iniciar la idea !!!!

Imagen de ezamudio

enredos

Si te gustan las soluciones enredadas, ahí te va otra opción, sin sockets: Creas un Runnable que corre dentro de ScheduledExecutor periódicamente, revisando si existe un archivo en alguna ubicación específica, por ejemplo /tmp/.stop_tu_servicio o C:\temp\mi_servicio.stop o como sea. Si encuentra el archivo, puede ser que simplemente porque el archivo existe, ya se detiene (ejecuta un System.exit(0)), o puedes revisar el contenido del archivo para que contenga alguna cadena que hay que validar para detener el servicio...

Imagen de skuarch

Se me olvidaba

No mencione que mi programa va a estar escuchando un puerto, entonces la mitad del problema ya esta casi resulto.

Gracias a todos por sus sugerencias y comentarios, espero poner el codigo en mi blog, para que cuando a alguien se le ofrezca algo parecido pues pueda tener la solicion.

Imagen de skuarch

Se me ocurrio otra forma

no se si exista alguna forma de saber cuantos programas de java estas corriendo, pero jconsole si lo sabe.

si se pudiera saber eso entoces dentro de tu programa checarias si tu aplicacion ya esta corriendo, y asi decidir si terminarla o dejarla.

bueno algo asi es la idea !!!

O también puedes escribir

O también puedes escribir el pid en un archivo y luego crear una clase que revise todos los archivos a los que le vea cara de pid y crear una aplicación automatica con java.awt.Robot que abra una consola y teclee kill EL_PID y luego le pregunte si está seguro y te mande un correo o lo integras con twitter para que te diga si está o no y luego con la respuesta le pones eso del programación con AR.drone ( hay que esperar a que salga el API para Java ) para que llegue volando y aterrice sobre la tecla enter si dijiste que sí....

¬¬

Ohh bueno

Imagen de ezamudio

A && C

Por algo es que cuando entra alcohol en la mente de un programador, no hay que usar el código que salga...

pregunta

tengo una clase corriendo como servicio windows(utilize wrapper-windows-x86-32-3.5.6),esta clase se conecta con una aplicacion q procesa la info q le manda el servicio,cuando le doy detener a mi servicio la aplicacion genera este mensaje
disconnected cleanly: Other party requested disconnection ya q estoi deteniendo la clase pro no termino la coneccion; no me genera error pro me gustaria q se desconectara de forma correcta.
no se si haya una forma de cerrar la coneccion al detener el servicio desde servicios de windows.

uppss

ese no es el mensaje
el mensaje es el siguiente

disconnected uncleanly: Connection closed

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">