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"