Wie man mit einem SIGTERM umgeht


Antworten:


72

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


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.