# Windowsshutdown abfangen



## wizkid (24. August 2006)

Also, folgendes suche ich.

Ich möchte gerne mit einem Java Programm den Windowsshutdown abfangen, damit ich vor dem Herunterfahren des Rechners noch einige Daten sichern kann. ( 10 kb ).

Geht das


----------



## shutdown (24. August 2006)

kann ich mir nicht vorstellen.

windows steuert die JRE
JRE steuert dein Programm

Dein Programm müsste also aus der JRE ausbrechen um auf Windows zu reagieren und letztlich Windows zu steuern.
Und das widerspricht allen Prinzipien von Java


----------



## DrivenHoliday (24. August 2006)

Hi,

wenn es nicht in Java funktioniert, starte doch eine Batch-Datei:


```
shutdown -a
```


----------



## shutdown (24. August 2006)

> Hi,
> 
> wenn es nicht in Java funktioniert, starte doch eine Batch-Datei:
> 
> ...



Cooler Tip - aber ich glaub auf ne andere Frage 

Das Problem bleibt bestehen - wie breche ich aus der JRE aus um auf Windows-Events zu reagieren.

Dein Beispiel ist gut um Windows per Java runterzufahren - für mehr aber auch nicht


----------



## kroesi (28. August 2006)

Hi !

Sowas geht meiner Meinung nach (nur) über JNI !

Du könntest in einem C++-Programm das Event abfangen, den Shutdown verhindern und evtl. ein Java-Event auslösen ...

Geht bestimmt, einen Codeschnipsel besitze ich leider nicht. Ausserdem ist das ganze dann Plattform abhängig ...

Krösi


----------



## Thomas Darimont (28. August 2006)

Hallo!

Also du könntest einen Shutdown-Hook verwenden um zu erkennen wann dein Java Prozess beendet wird... alternativ dazu könnte man auch mit einem SignalHandler auf entsprechende OS-Signale reagieren... ich würde jedoch die Shutdown-Hook Methode vorziehen.


```
/**
 * 
 */
package de.tutorials;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;

import sun.misc.Signal;
import sun.misc.SignalHandler;

/**
 * @author Thomas.Darimont
 *
 */
public class ShutdownAwareJavaExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        System.out.println("Running...");
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run() {
                try {
                    System.out.println("[ShutdownHook] Shutdown detected!");
                    PrintWriter printWriter = new PrintWriter(new FileWriter("c:/shutdown_hook.log"));
                    printWriter.println("EXIT @ " +  System.currentTimeMillis());
                    printWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        
        Signal.handle(new Signal("TERM"), new SignalHandler(){
            public void handle(Signal arg0) {
                try {
                    System.out.println("Shutdown detected!");
                    PrintWriter printWriter = new PrintWriter(new FileWriter("c:/shutdown.log"));
                    printWriter.println("EXIT @ " +  System.currentTimeMillis());
                    printWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        
        try {
            TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
```

Gruß Tom


----------

