# Sauberes Beenden des Programms beim Herunterfahren?



## PersonImpl (1. Okt 2008)

Hallo!

Beim Experimentieren mit Lock-Files (zum Verhindern von multiplen Programm-Instanzen) ist mir aufgefallen, dass typische Java-Programme anscheinend nicht auf "saubere" Weise beendet werden, wenn Windows / Linux herunterfährt, sondern das Betriebssystem den Prozess einfach killt, so als würde man mit Strg+Alt+Entf das Programm killen. Das ist besonders doof, wenn es sich um ein Programm handelt, das sich normalerweise im System Tray versteckt, sodass der Benutzer meist vergisst, es vor dem Herunterfahren zu beenden.
Weiß jemand, ob und wenn ja, was man dagegen machen kann?


----------



## Ark (1. Okt 2008)

Was sind denn "typische" Java-Programme dieser Art? oo

Ark


----------



## PersonImpl (1. Okt 2008)

typisch = Desktop-Anwendungen, also das Java-Zeugs, das man sich normalerweise so über Sourceforge und andere Quellen runterlädt.

Naja, meinetwegen kannst du "typisch" auch umdefinieren, wenn du mehr so etwas wie Java EE im Sinne hattest...


----------



## Wolfgang Lenhard (1. Okt 2008)

Du kannst einen ShutdownHook einrichten (http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)). Dabei besteht allerdings die Gefahr, dass bei einem Fehler in Deinem Code das Beenden des Programms hängt - aus diesem Grund mit Vorsicht zu genießen.

Man kann dann in einem eigenen Thread auf das Ende von Schreibprozessen warten ...


----------



## SlaterB (1. Okt 2008)

wenn PersonImpl zwischen 'sauberen Beenden' und Strg+Alt+Entf unterscheidet und ShutdownHook nicht zum 'sauberen Beenden' dazugehört,
wie soll dann bisher das 'saubere Beenden' funktioniert haben?


----------



## PersonImpl (1. Okt 2008)

Also das Problem besteht im Grunde darin, dass es eine Lockfile gibt und diese immer dann gelöscht werden soll, wenn das Programm auf "normale" Weise terminiert, und nicht gelöscht werden soll, wenn das Programm abstürzt. Ausloggen und Herunterfahren würde ich hier zu "normal" zählen, doch es scheint, als würde die letzte Zeile in main(), die für das Löschen der Lockfile sorgt, nicht ausgeführt werden, wenn man sich ausloggt oder den Computer herunterfährt.

Hab's mal mit dem Shutdown Hook ausprobiert:

```
Runtime.getRuntime().addShutdownHook(new Thread() {
   public void run() {
      new File(Const.LOCK_FILE_PATH).delete();
   }
});
```
... und es funktioniert leider nicht wie gewünscht. Normales Beenden des Programms löscht die Lockfile, aber nicht Neustart oder Ausloggen.


----------



## Landei (1. Okt 2008)

Muss es unbedingt ein Lockfile sein? Warum nicht einfach einen Port belegen?


----------



## The_S (2. Okt 2008)

http://www.just-my-2-cents.de/files/SingleInstanceController.zip

Dabei ist es egal, wie das Programm beendet wird. (Kombination aus Port und File-Lock)


----------



## PersonImpl (2. Okt 2008)

@ Hobbit_im_Blutrausch
Danke für den Vorschlag, werd's mal ausprobieren!
Noch eine wichtige Frage: Unter was für einer Lizenz steht denn deine Library? Brauch nämlich etwas EPL-kompatibles...


----------



## The_S (3. Okt 2008)

siehe PN


----------

