Catch lorsque le processus Java est terminé

Comment puis-je attraper quand quelqu’un tue mon application (java, mais ce n’est pas important) par taskmanager ou par la commande console taskkill?

Je comprends que je ne peux pas attraper ce dans mon application mais peut-être que je peux le faire par un crochet avec OS (Windows bien sûr). Peut-être que la bibliothèque easyhook ( http://www.codeplex.com/easyhook ) peut m’aider, mais je n’y trouve pas d’exemples. Notre application est souvent morte sur les serveurs des clients et je veux juste savoir qui (ou quoi) la tue. Nous sums sûrs que ce n’est pas un problème d’application, il semble que le processus java.exe ait été tué par taskmanager

Tu peux le faire:

Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { // run some code } }); 

Si la machine virtuelle plante dans le code natif, cela ne sera pas appelé. Il ne sera pas non plus appelé si la machine virtuelle est arrêtée. Il ne vous dit pas pourquoi il ferme non plus. Voir Conception de l’API Shutdown Hooks . Je ne pense pas que vous pouvez obtenir plus d’informations que cela.

Dans le passé, j’ai souvent utilisé Java Service Wrapper . C’est un processus distinct qui démarre et redémarre les processus Java et enregistre les résultats, ce qui peut être utile si des exceptions tuent le processus de manière inattendue.

Vous pouvez faire simplement par l’application Java, en utilisant deux applications. Voici comment cela se fait dans de nombreux systèmes de production Java

  1. Votre application principale va créer un fichier .lock dans un emplacement standard et le verrouiller exclusivement.
  2. Votre autre programme (peut-être l’appeler l’application de conciergerie) fera un appel de locking () et continuera d’attendre.

  3. Lorsque l’appel de locking est de retour, vous pouvez être sûr que votre application principale est terminée. Maintenant, vous pouvez déterminer.

    En ce qui concerne la question “Pourquoi l’application est-elle supprimée”, techniquement, vous ne pouvez pas trouver (peut-être 1 ou 2 scénarios, mais pas tous les scénarios), AFAIK.

Vous pouvez utiliser une seconde application qui s’exécutera sur l’ordinateur local et surveiller votre application principale. Lorsque l’application principale tombe en panne, elle peut faire quelque chose (p. ex. redémarrer, enregistrer l’événement) c

Il n’y a pas de moyen (standard) de déterminer quand votre application est tuée par le gestionnaire de tâches avec Java.

L’approche habituelle consiste à avoir une deuxième application qui lance l’application principale en tant que processus enfant (utilisez ProcessBuilder ). Le wrapper remarquera la mort de l’enfant. Pour toutes les raisons de terminaison habituelles, définissez un code de sortie via System.exit() dans votre application principale. Dans votre wrapper, vérifiez le code de sortie. Si ce n’est pas celui que vous définissez explicitement, alors quelqu’un a tué l’application ou s’est écrasé à cause d’un bogue de machine virtuelle.

Pour les distinguer, vérifiez le résultat de l’application enfant et recherchez les vidages sur incident de la machine virtuelle dans le répertoire actuel (peu importe ce que cela peut être pour votre application; en général, c’est le répertoire dans lequel votre application a été installée).