Crochet d’arrêt de UNIX

J’essaie de faire sortir mon programme Java avec élégance sur mon serveur unix. J’ai un fichier jar que je commence par un travail cron le matin. Puis, le soir, quand je veux l’arrêter, j’ai un job cron qui appelle un script qui trouve le PID et appelle kill -9 . Cependant, il ne semble pas que mon crochet d’arrêt soit activé lorsque je termine de cette manière. J’ai aussi essayé de kill (no -9) et j’ai le même problème. Comment puis-je m’assurer que le hook d’arrêt est appelé? Peut-être existe-t-il une meilleure façon de tuer mon processus quotidiennement.

 class ShutdownHook { ShutdownHook() {} public void attachShutDownHook() { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.out.println("Shut down hook activating"); } }); System.out.println("Shut Down Hook Attached."); } } 

Vous pouvez utiliser du code comme celui-ci sur Unix pour piéger le signal SIGINT (# 2):

 Signal.handle(new Signal("INT"), new SignalHandler() { public void handle(Signal sig) { // Forced exit System.exit(1); } }); 

kill -9 envoie un signal KILL . Ce signal ne peut pas être intercepté par le programme.

Si vous appelez kill , le signal TERM (15) sera envoyé. Dans ce cas, la JVM intercepte le signal et les hooks d’arrêt sont exécutés.

Cela n’a rien à voir avec les signaux que la JVM est en train de capter / recevoir, mais tout ce qui concerne le terrible processus d’arrêt de Gnome, qui doit apparemment être coopératif pour ne pas forcer le lit (et le jdk n’a pas ). Si vous voulez voir une conséquence encore pire, essayez de lancer:

 dbus-monitor --profile --session type='method_call',interface='org.gnome.SessionManager' 

sur un shell, et se déconnecter ou redémarrer: il va planter gnome-shell et suspendre l’ordinateur jusqu’à ce que vous vous connectiez sur un TTY et ordonner un redémarrage. Peut-être que kdbus résoudra ce problème, peut-être pas. La seule chose que je sais, c’est que shutdownhooks sur une application Java qui utilise AWT (pas de ligne de commande) n’exécutera JAMAIS ses shutdownhooks sur GNOME3. En fait, la VM sortira toujours avec un code non nul (échec), probablement à partir du code natif. Au moins, il ne se bloque pas, bien que cela rende les hooks d’arrêt inutiles (j’essaie de contourner le problème en utilisant dbus-monitor, mais comme vous pouvez le voir dans l’exemple que j’ai donné, c’est un peu trop dangereux).