Code ausführen bei JVM-Zerstörung

Jutschin

Mitglied
Hallo!

Ist es möglich einen (Java-)Code vor/bei der Beendigung des Programms auszuführen, auch wenn dies mit dem Task-Manager passiert bzw. die JVM abgedreht wird?

Eine Java-Applikation wird beendet, wenn

  • der letzte Thread beendet ist, der kein Daemon-Thread ist,
  • die Anwendung mit Aufruf der Methode System.exit() terminiert wird,
  • die Anwendung vom Benutzer mit Strg+C auf der Konsole abgebrochen wird,
  • die Virtual Machine durch Aufruf der Methode System.halt() gestoppt wird oder
  • die Anwendung durch externe Systemaufrufe terminiert wird (z. B. durch das Beenden über den Windows Task-Manager).

Ersten 2 Fälle sind klar. Ab dem 3. Fall wird es schon etwas schwieriger, wobei der letzte Fall der, für mich, wichtigste ist.

Nun meine Frage, es muss doch eine Methode geben, die das KILL-Signal entgegennimmt und danach das Programm herunterfährt.

Eine Hilfe in jede Richtung wäre echt nett.

//edit

Hilft da möglicherweiße das Stichwort "Shutdown-Hook" ?
 
Zuletzt bearbeitet:
G

Gast2

Gast
Hilft da möglicherweiße das Stichwort "Shutdown-Hook" ?
Genau, du kannst einen ShutdownHook registrieren:

Java:
Runtime.getRuntime().addShutdownHook(new Thread() {
	@Override
	public synchronized void start() {
		System.out.println("beendet");
	}
});
Allerdings sollte man da nen paar Sachen beachten, du hast beispielsweise nicht unbegrenzt viel Zeit. Wenn dein Thread zulange irgendwas arbeitet wird der irgendwann gestoppt.
Genaueres was du machen kannst und was nicht findet sich in der API:
Runtime (Java 2 Platform SE 5.0))
 

Jutschin

Mitglied
Ich weiß, eine dumme Frage, aber wie viel "Zeit" bleibt mir um Code auszuführen?

Wird dieser Hook auch ausgeführt, wenn die JVM abgedreht wird?
 
G

Gast2

Gast
Wieviel Zeit du hast hängt wohl vom Betriebssystem ab. Irgendwann wird der Prozess halt abgeschossen wenn der sich nicht beendet.

Zu deiner zweiten Frage: Ja, steht aber auch in der API zum nachlesen.
 

hemeroc

Bekanntes Mitglied
Generell kann nicht davon ausgegangen werden das ein ShutdownHook ausgeführt wird wenn die VM unerwartet terminiert wird.
Generelle Lösungen für dein Problem könnten sein (je nach Zuverlässigkeit/Anforderung)
  • ShutdownHook
  • Zweites Programm das mit dem ersten kommuniziert ein beenden registriert
  • Persistieren einer Aufgabenliste und weiter abarbeiten wenn das Programm erneut gestartet wird

Wenn du den genauen Anwendungsfall beschreibst kann ich dir sicherlich besser helfen.

Liebe Grüße
Hemeroc
 

Jutschin

Mitglied
Ich versuche einen Vergleichsfall heranzuziehen, da der wirkliche nicht weiterzuempfehlen ist. ;)

Ich denke an 2 Arten, wie mein Programm arbeitet:

Fall 1)

Mein Programm läuft in einer Endlosschleife, wobei jede 500ms auf einem FTP-Server zugegriffen wird. Falls eine Bedienung erfüllt ist, führt er weiteren Code aus, ansonsten wartet er wieder 500ms bis er wieder auf den FTP-Server zugreift.

Fall 2)

Mein Programm greift auf den FTP-Server zu und beendet sich. Nach bestimmter Zeit soll es wieder aufgerufen werden und wieder auf den Server zugreifen.

Ich tendiere zu 90% zum 1. Fall.

Schaltet aber nun der Benutzer das Programm ab bzw. beendet die JVM per Task-Manager, möchte ich das Programm bzw. eine bat oder Sonstiges aufrufen, das mein Programm wieder in Gang bringt.

Dies sollte möglichst perfomancesparend arbeiten und nicht die CPU für sich alleine kontrollieren. ;)

Funktioniert dies mit einem Shutdown-Hook, falls der Benutzer dies macht?
 

Jutschin

Mitglied
Habe gerade herumgetest mit den Hook.

Er wird nur wirksam, falls ich das Programm über die Konsole starte und dann per STRG+C beende.

Falls ich per TaskManager beende, passiert nichts. In Netbeans passiert sowieso nichts.

Einige Erklärungen? bitte? :D
 
M

maki

Gast
Einige Erklärungen? bitte? :D
Strg+C, Fenster schliessen etc. pp.ist eine höfliche Aufforderung an das Program, sich zu beenden, da hat das Programm Zeit um aufzuräumen.
Der Taskmanager dagegen "tötet" das Programm ohne wenn und aber, und zwar sofort.

Vereinfacht ausgedrückt ;)

Wenn jemand den Stromstecker zeiht wird dein Shutdownhook auch nicht mehr aufgerufen... alles in allem haben Shutdownhooks eben massive Einschränkungen ;)
 
G

Gast2

Gast
In manchen Fällen kannst du halt nichts tun. Wenn dein Prozess gekillt wird dann ist der weg. Wenn der Strom ausfällt kannst du nicht auch noch schnell nen paar Daten sichern ;)
 
W

WinService

Gast
Eine Lösung hätte ich da vielleicht noch : Windows-Service
Es gibt verschiedene Java-EXE-Wrapper die in der Lage sind Windows-Service-Binaries zu erstellen. Installierst du einen solchen Service im System wird dieser normalerweise vom User "SYSTEM" ausgeführt und lässt sich auch als "Admin" nicht über den TaskManager killen (Zugriff verweigert). Zwar kann ein Admin einen Service stoppen, dies kann man aber anfangen und einen Fehler auslösen das selbst einem Admin der "SERVICE STOP" callt gesagt wird "is' nich'".
So verhinderst du wirkungsvoll das dein Programm überhaupt abgewürgt werden kann.
Um dann auch noch ganz krasse Cracks auszusperren die sich mal eben in "SYSTEM" "hacken" und so die nötigen Rechte haben um eben diesen Service zu stoppen und den Prozess zu killen kann man das ganze über mehrere Services verteilen so das man selbst mit "KILL-Bots" nur schwer hinterherkommt.

Es gibt also schon Techniken eine Java-App so zu gestalten das es selbst für erfahrene User schwer ist diese "abzuwürgen", aber Gegenfrage : ist es den Aufwand wert ? Wofür willst du sowas überhaupt ? Ich meine alleine "alle 500ms FTP-Server anfragen" ist schon "krass" und es wundert mich das du vom FTP kein "flood"-DC bekommst (meiner hätte dich nach 3sec erstmal für ne Stunde auf Eis gelegt). Ich denke es dürfte bessere Möglichkeiten für das geben was du umsetzen willst. Alles in allem klingt das ziemlich "wild" als das der Nutzen den Aufwand lohnen würde.
 

Empire Phoenix

Top Contributor
Restten ubuntu live starten und einfach die service killen.
Zumindest würde ichd as ohne weiters nachdenken machen, wenn ich ein Java programm sehe das sich so verhält. (Falls der virenscanner das nicht vorher mit der verhaltenserkennung schon abgewürgt hat)
 

Jutschin

Mitglied
@WinService

Werde mich in die Richtung entwickeln, habe auch bereits im Vorfeld einiges dazu gelesen.
Sieht mir nach einer guten Lösung im Bezug Aufwand/Leistung aus.

Bezug zu "500ms FTP-Server" war nur als Beispiel herangezogen, vielleicht extrem, aber halt nur ein Beispiel ;)

Danke an alle!
 
W

WinService

Gast
@WinService

Werde mich in die Richtung entwickeln, habe auch bereits im Vorfeld einiges dazu gelesen.
Sieht mir nach einer guten Lösung im Bezug Aufwand/Leistung aus.

Bezug zu "500ms FTP-Server" war nur als Beispiel herangezogen, vielleicht extrem, aber halt nur ein Beispiel ;)

Danke an alle!

Wie gesagt : das war nur so noch ne Idee die mir eingefallen ist weil ich zur Zeit damit auch rumspiele, im Produktiven Umfeld sollte man sowas aber eher vermeiden da es doch sehr auf System-lastig ist im Hintergrund dauernt eine VM laufen zu lassen (die ja immerhin auch RAM und CPU "frisst").
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
Gossi Java Code in einer GUI eingeben und ausführen? Allgemeine Java-Themen 2
D Code später ausführen Allgemeine Java-Themen 8
E Source-Code aus einer Textdatei kompilieren und ausführen Allgemeine Java-Themen 4
M run()-Code zweier Threads strikt abwechselnd ausführen Allgemeine Java-Themen 7
M Unsicher, ob das Code richtig ist Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
schemil053 Methoden Code-Verbesserung Allgemeine Java-Themen 2
D Webarchive (war): Code verschleiern Allgemeine Java-Themen 7
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
OnDemand Releaseversion Tag in Code Allgemeine Java-Themen 5
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
F Code auslagern Allgemeine Java-Themen 5
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
A code wird nicht ausgeführt Allgemeine Java-Themen 3
B Bitte um Code Erklärung Allgemeine Java-Themen 5
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
OnDemand Clean Code oder Allgemeine Java-Themen 5
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
J Simple Date Format Alternativen bitte um Code Allgemeine Java-Themen 14
AGW in Java-Code plötzlich ein paar Wörter in Rot Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
H Precompilierten code ansehen Allgemeine Java-Themen 3
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
L Ausgabe von in Echtzeit ausgeführten Code Allgemeine Java-Themen 9
Drachenbauer Wie kann ich die menge an code reduzieren? Allgemeine Java-Themen 28
Thallius Warum ist dieser Code OS abhängig? Allgemeine Java-Themen 10
S Code Erklärung Allgemeine Java-Themen 21
B Pausem im Code Allgemeine Java-Themen 2
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
F Code in Klassen bringen Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
F Klassen Spaghetti Code Vermeidung Allgemeine Java-Themen 16
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
J Code Page characters darstellen Allgemeine Java-Themen 12
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
I Python Code in Java Code Allgemeine Java-Themen 9
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
O Standard library nativer C code Allgemeine Java-Themen 1
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen ​ Allgemeine Java-Themen 3
N Morse Code decoder Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
S Eclipse exit code 805306369 Allgemeine Java-Themen 1
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
F Verständlichkeitsproblem bei Java Code?! Allgemeine Java-Themen 2
G Eclipse Eclipse: Unreachable code Allgemeine Java-Themen 16
P Java Android Code in IOS compilieren? Allgemeine Java-Themen 9
C Code vereinfachen Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
Prafy Best Practice Code Refaktorisierung Allgemeine Java-Themen 7
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
C ASCII-Code in Java Allgemeine Java-Themen 1
J Java-Code in DLL packen Allgemeine Java-Themen 5
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Frage zu meinem Code Allgemeine Java-Themen 2
B Code generierung Velocity Templates Telosys Allgemeine Java-Themen 1
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
N HTTP response code: 403 Allgemeine Java-Themen 3
D Code bitte mit 19 stelligen Zahlen kompatibel machen Allgemeine Java-Themen 5
D Java Compiler code referencen Allgemeine Java-Themen 0
B Fehler im Java-Code Allgemeine Java-Themen 4
A PHP-Code zu Java-Code Allgemeine Java-Themen 5
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
X Was macht folgender Code!? Allgemeine Java-Themen 6
K Code zu einem Projekt entschluesseln Allgemeine Java-Themen 15
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
Fab1 Best Practice Vorgehensweise bestehenden Code/Programm verschönern Allgemeine Java-Themen 4
M Code optimieren Allgemeine Java-Themen 7
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
S EAN-Code Tabelle für CD's Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben