125 votes

Comment gérer avec élégance le signal SIGKILL en Java

Comment gérez-vous les nettoyer quand il reçoit un signal kill?

Par exemple, il y a une demande je me connecte à qui veut de toute application tierce (mes applications) pour envoyer un finish commande lors de la déconnexion. Quel est le meilleur dire à envoyer celui - finish commande lorsque mon application a été détruit avec une kill -9?

edit 1: kill -9 ne peut pas être capturé. Merci les gars pour corriger moi.

edit 2: je suppose que ce serait le cas lorsque l'on appelle juste tuer qui est le même que ctrl-c

162voto

Jarrod Roberson Points 32263

La façon de gérer cela pour rien d' autre que kill -9 serait d'enregistrer une fermeture à crochet. Si vous pouvez utiliser (SIGTERM) kill -15 à la fermeture crochet fonctionne. (SIGINT) kill -2 NE provoquer le programme gracieusement de sortie et d'exécuter l'arrêt de crochets.

Enregistre une nouvelle machine virtuelle fermeture à crochet.

La Java virtual machine s'arrête en réponse à deux types d'événements:

* The program exits normally, when the last non-daemon thread exits or

lors de la sortie (de manière équivalente, Système.exit), la méthode est invoquée, ou

* The virtual machine is terminated in response to a user

interrompre, telles que taper ^C, ou un à l'échelle du système de l'événement, telles que la déconnexion de l'utilisateur ou l'arrêt du système.

J'ai essayé le programme de test suivant sur OSX 10.6.3 et sur kill -9 il n'a PAS exécuté l'arrêt de crochet, ne pense pas qu'il le ferait. Sur un kill -15 il N' exécutez la fermeture crochet à chaque fois.

public class TestShutdownHook
{
    public static void main(final String[] args) throws InterruptedException
    {
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                System.out.println("Shutdown hook ran!");
            }
        });

        while (true)
        {
            Thread.sleep(1000);
        }
    }
}

Il n'y a aucun moyen de vraiment traiter comme un kill -9 dans n'importe quel programme.

Dans de rares circonstances, le virtuel la machine peut avorter, c'est arrêter courir sans arrêter proprement. Cela se produit lorsque la machine virtuelle est mis fin à l'externe, par exemple avec le signal SIGKILL sur Unix ou l' TerminateProcess appel à Microsoft De Windows.

La seule véritable option pour gérer un kill -9 est d'avoir un autre observateur de programme pour regarder votre programme principal à disparaître ou à l'utilisation d'un script de lancement. Vous pourriez faire ça avec un script shell qui a interrogé l' ps commande la recherche de votre programme dans la liste et d'agir en conséquence quand il a disparu.

#!/bin/bash

java TestShutdownHook
wait
# notify your other app that you quit
echo "TestShutdownHook quit"

12voto

Asgeir S. Nilsen Points 805

Il y sont des façons de gérer votre propre signaux dans certaines machines virtuelles -- voir cet article sur la JVM HotSpot par exemple.

En utilisant le Soleil interne sun.misc.Signal.handle(Signal, SignalHandler) appel de la méthode, vous êtes également en mesure d'enregistrer un gestionnaire de signal, mais probablement pas pour les signaux comme INT ou TERM car ils sont utilisés par la JVM.

Pour être en mesure de gérer tout du signal que vous auriez à sauter hors de la JVM et dans le Système d'Exploitation du territoire.

Ce que je fais généralement pour (par exemple) de détecter un arrêt anormal, est le lancement de mon JVM à l'intérieur d'un script Perl, mais le script d'attente pour la JVM à l'aide de l' waitpid appel système.

Je suis ensuite informé à chaque fois que la JVM des sorties, et pourquoi il a quitté, et peut prendre les mesures nécessaires.

7voto

lexicore Points 7723

Vous pouvez utiliser Runtime.getRuntime().addShutdownHook(...) , mais vous ne pouvez pas être sûr qu'il sera appelé dans tous les cas .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X