Prozess sanft beenden

  • Themenstarter Themenstarter Gelöschtes Mitglied 16444
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 16444

Guest
Moin!

Ich habe einen Javaprozess, der über eine Batch gestartet wird. Diesen möchte ich nun von außerhalb sanft beenden (wenn bestimmte Voraussetzungen erfüllt sind). Es sollen also noch alle Daten gespeichert werden können. Das macht die Anwendung, wenn ich in dem Konsolenfenster STRG + C drücke.

Ich möchte das ganze aber ja automatisieren und dabei nach Möglichkeit verhindern ein eigenes Programm schreiben zu müssen. Ich habe es schon mit "taskkill" versucht, aber auch ohne den Parameter "/F" schießt es das Programm schon ab, sodass keine Daten mehr gespeichert werden.
 
Signal-Handler dürften dir helfen. Einfach die Handler-Routine für die Kill-Signale auf dein Programm umbiegen und den Handler das Speichern der Daten übernehmen lassen.
 
Schau dir in Bezug auf bitmunchers Post die Klasse Runtime in den JavaDocs an: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html
Allerdings kommt es darauf an, welches Signal du sendest, d.h. SIGSEGV u.ä. sind meines Wissens noch nicht direkt im Programm erkennbar. Signale, welche vom user gesendet werden und einen Shutdown verursachen sollen solltest du aber mit der Funktion addShutdownHook aus der Klasse Runtime erkennen können und daraufhin einen sauberen Shutdownvorgang starten.
 
Hmm, ich habe mich wohl etwas missverständlich ausgedrückt. Das Java Programm, welches da läuft ist keines von mir, bei dem ich jetzt Änderungen vornehmen könnte.
Ich suche nach einer Möglichkeit es so, wie es jetzt geschrieben ist, von außerhalb zu beenden. Ich will es aber nicht abschießen, sondern es soll sich sauber beenden um Datenverlust zu verhindern.
 
Wie gesagt, will ich es vermeiden das Programm zu ändern.
 
Das einzige, was mir noch einfällt, wäre ein Programm, welches einen User simuliert, der den Beenden-Button drückt..
 
Hmm, damit, dass das doch so kompliziert wird, hätte ich dann nicht gerechnet. Ich werde mal schauen, was ich dann jetzt für eine Lösung nehmen werde. Vielleicht fällt ja jemandem doch noch etwas ein..

Danke auf jeden Fall für eure Vorschläge!
 
Die Frage ist, inwiefern du einen sauberen Shutdown nicht auch durch etwas anderes erreichen kannst.
Ein Beispiel aus meiner Erfahrung vor kurzem:
gnome-keyring-daemon beendet sich ca. 70sek nach Start der Oberfläche mit einem segfault (Ursache liegt aller vorraussicht nach an HAL). Leider werden die von gkd erstellten Umgebungsvariablen nicht wieder gelöscht, wesshalb ein einfacher Neustart des Deamons zu keiner Verbesserung führt ("Old daemon running..."). Legt man allerdings nun einen Symlink mit dem Namen der Datei, die in der Umgebungsvariablen steht, an und lässt ihn auf die neuen Dateien zeigen funktioniert alles wieder. Kleiner Hack um das Problem zu umgehen, vielleicht könntest du ähnliches machen ;)
 
Ich habe mir das jetzt nochmal genauer angeschaut. Es scheint mir so, als ob die Signale von der JVM selbst gehändelt werden und dann eben ggf. die registrierten Shutdownhooks aufgerufen werden. Ist das so korrekt?

Wenn dem so ist, dann müsste ich ja das Signalhandling überschreiben. Ein korrekter Shutdownhook existiert ja bereits, wird wohl nur nicht in allen Fällen ausgeführt.
 
Zurück
Oben