2010-06-10 12 views
7

Mi campo principal es .Net, pero recientemente tengo algo que ver con Java. Tengo que crear una utilidad de shell en Java que pueda ejecutarse en segundo plano y leer pocos registros de base de datos después de la duración especificada y hacer un procesamiento posterior. Es un tipo de programador. Ahora tengo algunas preocupaciones:¿Cómo detener la ejecución del programa Java desde la línea de comandos?

Cómo hacer que esto funcione como un servicio. Quiero ejecutarlo a través de un script de shell y la utilidad debería comenzar a ejecutarse. Por supuesto, el control debería volver al script de llamada.

En segundo lugar, eventualmente deseo detener este proceso. ¿Cómo lograr esto?

Entiendo que estas son preguntas básicas, pero realmente no tengo ni idea de dónde comenzar y qué opciones son mejores para mí.

¿Alguna ayuda/consejo por favor?

+0

@danben Sure, will do ... Gracias – Aakash

Respuesta

2

Me gustaría ejecutar el programa utilizando un programador o un servicio. Sin embargo, si desea utilizar un archivo bat y hacerlo mediante programación, he descrito a continuación un posible enfoque:

En el programa Java, se puede obtener el PID mediante programación, y luego escribir en un archivo:

public static void writePID(String fileLocation) throws IOException 
{ 
    // Use the engine management bean in java to find out the pid 
    // and to write to a file 
    if (fileLocation.length() == 0) 
    { 
     fileLocation = DEFAULT_PID_FILE; 
    }  
    String pid = ManagementFactory.getRuntimeMXBean().getName(); 
    if (pid.indexOf("@") != -1) 
    { 
     pid = pid.substring(0, pid.indexOf("@")); 
    }            
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileLocation)); 
    writer.write(pid); 
    writer.newLine(); 
    writer.flush(); 
    writer.close();      
} 

A continuación, puede escribir un archivo stop .bat que matará el programa en ejecución en Windows. Se podría hacer algo como:

setlocal 
IF EXIST app.pid FOR /F %%i in ('type app.pid') do TASKKILL /F /PID %%i 
IF EXIST app.pid DEL app.pid 
endlocal 

Por supuesto, app.pid es el archivo escrito por el método de Java anteriormente.

No estoy seguro de cómo podría escribir un script que inicie un programa java, y revierte el control en la terminación. Me interesaría ver si alguien tiene una solución para eso.

+0

¿Eso significa que tendré que escribir otra aplicación java que leerá ese archivo y matará el proceso en ejecución? – Aakash

+0

No, el archivo .bat es el bit que está matando su proceso. Es un poco de VBScript el que está acabando con la aplicación en ejecución. IF EXIST aplicación.pid FOR/F %% i en ('tipo aplicación.pid') hacer TASKKILL/F/PID %% i Si está ejecutando esto en * nix, podría escribir un script de shell que lo haga la misma cosa. – Luhar

1
ps ux 

ver pid

kill pid 

O será mejor que proporcionan un script de parada que indica la aplicación, lo que hace System.exit(0)

+0

, siempre y cuando no esté haciendo algo así como las transacciones de la base de datos, matar al pid está bien. Si él tiene transacciones en la base de datos, puede necesitar hacerlo un poco más fancily. – bwawok

+0

@bwawok Tienes razón. Estoy haciendo trabajo de base de datos allí. – Aakash

1

no se especificó la plataforma. Si está en Windows, debe buscar la integración con el Control de servicio para crear un servicio de Windows. http://en.wikipedia.org/wiki/Windows_service. Una vez que haya implementado los enlaces de servicio, es posible iniciar y detener el servicio a través de la GUI de control de servicio o utilizando la sintaxis net stop MyService desde la línea de comando.

+0

Quiero hacer esto en la plataforma Unix. Gracias – Aakash

2

Supongo que está jugando su programa java con una caja Linux/Unix. Para ejecutar la aplicación como un demonio, puede intentar

nohup java YourJavaClass & 

Para detener su aplicación, puede:

kill [psIdofYourApplication] 

o

fg [your application job Id] 
Ctrl-C 

Si usted quiere hacer algo de post-procesamiento después de que la aplicación reciba la señal 'matar/parar'.echa un vistazo a addShutdownHook(Thread hook)

O sun.misc.SignalHandler

0

Según entiendo, quieres algo como esto:

if (System.in.avaliable() > 0) { 
    in = new BufferedReader(new InputStreamReader(System.in); 
    String InLine = in.readLine(); 
    ... 
} 

Estoy en lo cierto?

Cuestiones relacionadas