Comment puis-je intercepter Ctrl+C (ce qui normalement tuerait le processus) dans une CLI (interface de ligne de commande) Java application?
Existe-t-il une solution multiplateforme (Linux, Solaris, Windows)?
J'utilise readLine()
de Console
, mais si nécessaire, je pourrais utiliser une autre méthode pour lire les caractères à partir de l'entrée standard.
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
Cela devrait être en mesure d'intercepter le signal, mais uniquement en tant qu'étape intermédiaire avant que la JVM ne s'arrête complètement, il se peut donc que ce ne soit pas ce que vous recherchez.
Vous devez utiliser un SignalHandler
(Sun.misc.SignalHandler
) pour intercepter le signal SIGINT
déclenché par un Ctrl+C (sous Unix comme sous Windows).
Voir cet article (pdf, page 8 et 9).
Je pars du principe que vous souhaitez vous arrêter sans problème et ne pas court-circuiter le processus d'arrêt. Si mon hypothèse est correcte, alors vous devriez regarder Shutdown Hooks .
Afin de pouvoir gérer Ctrl+C sans arrêter pour une raison quelconque, vous devrez utiliser une certaine forme de gestion du signal (puisque le Ctrl+C l'entrée n'est pas réellement transmise directement à votre application, mais est plutôt gérée par le système d'exploitation qui génère un SIGINT qui est ensuite transmis à Java.
Voir http://www.Oracle.com/technetwork/Java/javase/signals-139944.html pour plus de détails sur la gestion des signaux.
(Si vous voulez simplement vous arrêter gracieusement, la réponse d'akf suffira.)
Quelques liens sur la façon de gérer SIGTERM - c'est le signal que le programme reçoit du côté du système d'exploitation:
http://blog.webinf.info/2008/08/intercepting-sigterm.html
http://Java.Sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html
http://www.ibm.com/developerworks/Java/library/i-signalhandling/
Cela devrait fonctionner sur les systèmes d'exploitation POSIX - c'est-à-dire que Mac et Unix devraient fonctionner, sur Windows, je ne suis pas sûr, je me souviens avoir entendu qu'il est également compatible POSIX dans une certaine mesure, mais pourrait être très différent avec différentes versions.