Wie man mit einem SIGTERM umgeht

74

Gibt es in Java eine Möglichkeit, ein empfangenes SIGTERM zu verarbeiten?

Martijn Courteaux
quelle

Antworten:

72

Ja, Sie können einen Shutdown-Hook bei registrieren Runtime.addShutdownHook().

Matthew Flaschen
quelle
1
Würde dieser Hook auch ausgelöst, wenn System.exit(1)er woanders ausgeführt wird? Ich versuche, diesem Muster zu folgen, um den kontrollierten Stopp für mein Multithread-Java-Programm zu handhaben, und finde, dass System.exit(1)die JVM dadurch nicht beendet wird.
ME
@ME ja das sind sie. Die Dokumentation zu Runtime.exit (von System.exit aufgerufen) finden Sie hier: docs.oracle.com/de/java/javase/11/docs/api/java.base/java/lang/…
erwaman
47

Sie können einen Shutdown-Hook hinzufügen , um eine Bereinigung durchzuführen.

So was:

public class myjava{
    public static void main(String[] args){
        Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
            public void run() {
                System.out.println("Inside Add Shutdown Hook");
            }   
        }); 

        System.out.println("Shut Down Hook Attached.");

        System.out.println(5/0);     //Operating system sends SIGFPE to the JVM
                                     //the JVM catches it and constructs a 
                                     //ArithmeticException class, and since you 
                                     //don't catch this with a try/catch, dumps
                                     //it to screen and terminates.  The shutdown
                                     //hook is triggered, doing final cleanup.
    }   
}

Dann führen Sie es aus:

el@apollo:~$ javac myjava.java
el@apollo:~$ java myjava 
Shut Down Hook Attached.
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at myjava.main(myjava.java:11)
Inside Add Shutdown Hook
Edward Dale
quelle
Dies gilt jedoch für das gesamte Herunterfahren des Systems. Während es in den meisten Fällen funktioniert, wäre es ideal, wenn es auf dem geerbten Prozess funktioniert.
mmm
4

Eine andere Möglichkeit, Signale in Java zu verarbeiten, ist das Paket sun.misc.signal. Informationen zur Verwendung finden Sie unter http://www.ibm.com/developerworks/java/library/i-signalhandling/ .

HINWEIS: Die Funktionalität innerhalb des sun. * -Pakets würde auch bedeuten, dass es möglicherweise nicht auf allen Betriebssystemen portabel ist / sich gleich verhält. Aber vielleicht möchten Sie es ausprobieren.

Arcamax
quelle
Aber in der Tat macht es das gleiche?
Martijn Courteaux
2
Nein - nicht genau. Die erwähnte Signalverarbeitungs-API kann verwendet werden, um die meisten nativen Betriebssystemsignale (Trap, Intr, Kill usw.) in Java Apps zu verarbeiten. Andererseits wird ShutdownHook nur aufgerufen, wenn JVM endgültig beendet wird (nachdem ein Kill-Signal empfangen wurde).
Arcamax
1
Ja, es sieht so aus, als hätten IBM Entwicklerarbeiten eine Website-Migration durchlaufen. Der Link funktioniert nicht mehr.
Arcamax
Informationen zum fehlerhaften Link zum Paket sun.misc.signal finden Sie unter stackoverflow.com/questions/19711062/…
Daniel
Verwenden Sie auch niemals Sonnenklassen - neuere JDKs werden Sie dafür beißen und Ihr Code wird nicht ausgeführt.
Ethan McCue