Comment arrêter le processus java gracieusement?
Comment puis-je arrêter un processus Java gracieusement dans Linux et Windows?
Quand Runtime.getRuntime().addShutdownHook
appelait, et quand n'est-il pas?
Que sur les finaliseurs, aident-ils ici?
Puis-je envoyer une sorte de signal à un processus Java à partir d'un shell?
Je cherche de préférence des solutions portables.
- vous devriez vraiment définir ce que vous entendez par gracieusement. (s'il vous plaît)
- Je suppose qu'ils dire qu'ils veulent avoir la possibilité de nettoyer des ressources, la libération, les serrures, et vider les données persistantes sur le disque avant que le programme est tué.
Vous devez vous connecter pour publier un commentaire.
Arrêt crochets exécuter dans tous les cas où la VM n'est pas la force de le tuer. Donc, si vous avez été à la publication d'une "norme" kill (
SIGTERM
à partir d'une commande kill), alors ils s'exécuter. De même, elles s'exécutent après l'appel deSystem.exit(int)
.Cependant un dur à tuer (
kill -9
oukill -SIGKILL
) alors qu'ils ne sera pas exécuté. De la même façon (et évidemment), ils ne s'exécute que si vous tirez la puissance de l'ordinateur, le déposer dans une cuve de lave en ébullition, ou de battre le CPU en morceaux avec un marteau de forgeron. Vous le saviez sûrement déjà, si.Finaliseurs vraiment devrait fonctionner ainsi, mais il est préférable de ne pas compter sur ça pour l'arrêt de nettoyage, mais plutôt de se reposer sur vos crochets d'arrêt pour arrêter les choses proprement. Et, comme toujours, être prudent avec les interblocages (j'ai vu beaucoup trop d'arrêt crochets accrocher l'ensemble du processus)!
Ok, après toutes les possibilités, j'ai choisi de travailler avec "Java de Surveillance et de Gestion"
Vue d'ensemble est ici
Qui vous permet de contrôler une application à partir d'une autre de façon relativement facile. Vous pouvez appeler l'application de contrôle à partir d'un script pour arrêter l'application contrôlée gracieusement avant de le tuer.
Voici le code simplifié:
Application contrôlée:
exécuter avec le suivant VM paramètres:
-Dcom.soleil.de la gestion.jmxremote
-Dcom.soleil.de la gestion.jmxremote.port=9999
-Dcom.soleil.de la gestion.jmxremote.authentifier=false
-Dcom.soleil.de la gestion.jmxremote.ssl=false
Application de contrôle:
exécuter avec la arrêter ou commencer que l'argument de ligne de commande
C'est tout. 🙂
Une autre façon: votre application peut ouvrir un serveur socet et d'attendre une information est arrivée à elle. Par exemple une chaîne de caractères avec "magic", le mot 🙂 et puis réagir pour faire l'arrêt du système: Système d'.exit(). Vous pouvez envoyer ces informations à l'socke en utilisant une application externe comme telnet.
Question Similaire Ici
Finaliseurs en Java sont mauvais. Elles apportent beaucoup de généraux à la collecte des déchets. Éviter autant que possible.
La shutdownHook uniquement quand la machine virtuelle est en cours d'arrêt. Je pense qu'il peut très bien le faire ce que vous voulez.
Ici est un peu délicat, mais la solution portable:
J'ai mis en place le Java Agent. Il est disponible sur Github: https://github.com/everit-org/javaagent-shutdown
Description détaillée de la solution est disponible ici: https://everitorg.wordpress.com/2016/06/15/shutting-down-a-jvm-process/
De signalisation dans Linux peut se faire "tuer" (l'homme à tuer pour les signaux disponibles), vous auriez besoin de l'ID de processus pour le faire. (ps ax | grep java) ou quelque chose comme ça, ou de stocker l'id de processus lorsque le processus est créé (il est utilisé dans la plupart des linux les fichiers de démarrage, voir /etc/init.d)
Portable de signalisation peut être fait par l'intégration d'une SocketServer dans votre application java. Il n'est pas difficile et vous donne la liberté de vous envoyer toutes les commandes que vous voulez.
Si vous vouliez dire, enfin, des clauses en place des finaliseurs; ils n'ont pas extecuted lorsque le Système.exit() est appelée.
Les finaliseurs devrait fonctionner, mais ne devrait pas vraiment faire quelque chose de plus important, mais l'impression d'une instruction de débogage. Ils sont dangereux.
Merci pour vous réponses. Fermeture crochets, coutures comme quelque chose qui pourrait fonctionner dans mon cas.
Mais j'ai aussi choppé le truc qui s'appelle la Surveillance et la Gestion des haricots:
http://java.sun.com/j2se/1.5.0/docs/guide/management/overview.html
Qui donne de belles possibilités, pour la surveillance à distance, et la manipulation du processus java. (A été introduit dans Java 5)