2010-06-10 4 views
7

Mein Hauptbereich ist .Net, aber vor kurzem habe ich etwas mit Java zu tun. Ich muss ein Shell-Dienstprogramm in Java erstellen, das im Hintergrund ausgeführt werden könnte, um nach einer bestimmten Dauer einige Datenbankeinträge zu lesen und die weitere Verarbeitung durchzuführen. Es ist eine Art Scheduler. Jetzt habe ich einige Bedenken:Wie kann ich die Ausführung eines Java-Programms über die Befehlszeile stoppen?

Wie man dies als Service arbeiten lassen. Ich möchte es über ein Shell-Skript ausführen und das Dienstprogramm sollte starten. Natürlich sollte das Steuerelement zurück zum aufrufenden Skript gelangen.

Zweitens, vielleicht möchte ich diesen Prozess beenden. Wie erreiche ich das?

Ich verstehe, das sind grundlegende Fragen, aber ich habe wirklich keine Ahnung, wo ich anfangen soll und welche Optionen für mich am besten sind.

Irgendwelche Hilfe bitte?

+0

@dan Sicher, wird ... Danke – Aakash

Antwort

2

Ich würde für das Ausführen des Programms mit einem Scheduler oder einem Dienst gehen. Allerdings, wenn Sie möchten, eine Fledermaus-Datei verwenden, und tut dies programmatisch, ich habe einen möglichen Ansatz unten beschrieben:

In Ihrem Java-Programm, können Sie die PID programmatisch bekommen, und es dann in eine Datei schreiben:

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();      
} 

Sie können dann eine Stop-BAT-Datei schreiben, die das laufende Programm in Windows beenden wird. Sie könnten etwas wie:

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 

Natürlich ist app.pid die Datei geschrieben von der Java-Methode oben.

Ich bin mir nicht sicher, wie Sie in der Lage sein würden, ein Skript zu schreiben, das ein Java-Programm startet und die Kontrolle über die Beendigung zurücknimmt. Mich würde interessieren, ob jemand dafür eine Lösung hat.

+0

Bedeutet das, dass ich möglicherweise eine andere Java-Anwendung schreiben muss, die diese Datei liest und den laufenden Prozess tötet? – Aakash

+0

Nein, die .bat-Datei ist das Bit, das Ihren Prozess zerstört. Es ist ein bisschen VBScript, das die laufende App zerstört. IF EXIST app.pid FOR/F %% i in ('Typ app.pid') TASKKILL/F/PID %% i Wenn Sie dies auf * nix ausführen, könnten Sie ein Shell-Skript schreiben, das tut das gleiche. – Luhar

1
ps ux 

siehe pid

kill pid 

Oder würden Sie besser einen Stopp Skript bereitstellen, die die Anwendung signalisiert, das tut System.exit(0)

+0

solange er nicht so etwas wie Datenbanktransaktionen tut, Töten der Pid ist in Ordnung. Wenn er Datenbanktransaktionen hat, muss er es vielleicht ein bisschen mehr machen. – bwawok

+0

@bwawok Sie haben Recht. Ich mache dort Datenbankarbeit. – Aakash

1

Sie die Plattform nicht angegeben haben. Wenn Sie unter Windows arbeiten, sollten Sie die Integration mit dem Dienststeuerelement untersuchen, um einen Windows-Dienst zu erstellen. http://en.wikipedia.org/wiki/Windows_service. Sobald Sie die Service-Hooks implementiert haben, können Sie den Dienst über die grafische Benutzeroberfläche des Dienststeuerelements starten oder stoppen oder net stop MyService über die Befehlszeile verwenden.

+0

Ich möchte dies auf Unix-Plattform tun. Danke – Aakash

2

Ich nehme an, dass Sie Ihr Java-Programm mit einer Linux/Unix-Box spielen. Um Ihre Anwendung als Daemon ausführen, Sie

nohup java YourJavaClass & 

versuchen können Ihre Anwendung zu beenden, können Sie entweder:

kill [psIdofYourApplication] 

oder

fg [your application job Id] 
Ctrl-C 

Wenn Sie etwas Nachbearbeitung tun möchten nachdem die Anwendung das "Kill/Stop" -Signal empfangen hat.Besuche addShutdownHook(Thread hook)

Oder sun.misc.SignalHandler

0

Wie ich verstehe, wollen Sie etwas wie folgt aus:

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

Habe ich Recht?

Verwandte Themen