2009-10-23 7 views
58

Est-il possible d'intercepter le signal Ctrl + C dans une application de ligne de commande java? J'aimerais nettoyer certaines ressources avant de mettre fin au programme.Catching Ctrl + C en Java

Répondre

65

Vous pouvez joindre un shutdown hook à la machine virtuelle qui obtient exécuté chaque fois que la machine virtuelle arrête:

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

  • Le programme quitte normalement, lorsque le dernier thread non démon sort ou lorsque la méthode exit (de manière équivalente, System.exit) est invoquée, ou

  • La machine ual est terminée en réponse à une interruption de l'utilisateur, par exemple Ctrl + C, ou un événement à l'échelle du système, tel que la fermeture de session ou l'arrêt du système.

Le fil que vous passer que le crochet d'arrêt doit suivre plusieurs règles, bien que, alors lisez attentivement la documentation liée à éviter tout problème. De plus, comme le souligne Jesper, les hameçons d'arrêt sont garantis à l'arrêt normal de la machine virtuelle, mais si le processus VM est terminé de façon forcée, ils ne le font pas. t. Cela peut se produire si le code natif se bloque ou si vous forcez le processus (kill -9, taskkill /f).

Mais dans tous les scénarios, tous les paris sont éteints de toute façon, donc je ne voudrais pas trop y réfléchir.

+0

Prenez garde que des crochets d'arrêt ne sont pas garantis de fonctionner en toutes circonstances; il peut y avoir des situations où ils ne sont pas exécutés, donc ne faites pas le bon fonctionnement de votre programme dépendant de ce que vous faites dans un crochet d'arrêt. – Jesper

+0

Ils ne sont pas exécutés lorsque le processus est terminé avec force ('TerminateProcess()' ou 'SIGKILL') mais cela est hors fonctionnement normal et puisque Ctrl + C est déjà couvert par le hook shutdown, il est sûr de l'utiliser. Vous ne pouvez pas faire grand-chose si le système d'exploitation termine réellement votre processus de toute façon. – Joey

+0

Si j'exécute 'kill' (envoie un signal TERM), cela sera-t-il pris dans le crochet d'arrêt? (Notez que ce n'est pas la même chose que 'kill -9', ce que je comprends de ce qui précède, il ne sera pas pris dans le crochet.) – ADTC

14

Juste à des fins de test de la console rapide ...

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(200); 
       System.out.println("Shouting down ..."); 
       //some cleaning up code... 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
+2

Votre exemple est spécifique à RaspberryPI ('SoftPwm',' gpio'). Vous pouvez ignorer ces appels de méthode. – harpun

Questions connexes