Comment Daemonize un Programme Java?
J'ai un programme Java que j'aimerais daemonize sur un système linux. En d'autres termes, je veux commencer à courir dans une coquille et qu'il continue de fonctionner après j'ai déconnecté. Je veux aussi être en mesure d'arrêter le programme proprement.
J'ai trouvé cet article qui utilise une combinaison de scripts shell de code Java et de faire le tour. Il semble bien, mais je voudrais quelque chose de simple, si possible.
Quelle est votre méthode préférée pour daemonize un programme Java sur un système Linux?
- Merci de voir stackoverflow.com/questions/407016/...
- Essayez
nohup java prog &
. - D'une façon plus propre de gérer les services à UNIX cr.yp.to/daemontools.html
- Possible dupe de stackoverflow.com/questions/11203483/...
Vous devez vous connecter pour publier un commentaire.
Apache Commons Daemon permettra de exécuter votre programme Java Linux démon ou WinNT Service.
Si vous ne pouvez pas compter sur Java Service Wrapper cité d'ailleurs (par exemple, si vous êtes en cours d'exécution sur Ubuntu, qui n'a pas de version de paquet de SW), vous voudrez probablement le faire à l'ancienne: de votre programme d'écriture de son PID dans /var/run/$nom_du_programme.pid, et écrire un standard script d'initialisation SysV (par exemple utiliser l'un pour ntpd comme un exemple, c'est simple) autour d'elle. De préférence, faire LSB-conforme, trop.
Essentiellement, le début de la fonction teste si le programme est déjà en cours d'exécution (par des tests si /var/run/$nom_du_programme.pid existe, et le contenu de ce fichier est le PID d'un processus en cours d'exécution), et si pas exécuter
La fonction d'arrêt et de contrôles sur /var/run/$nom_du_programme.pid, teste si le fichier est le PID d'un processus en cours d'exécution, vérifie qu'il s'agit d'une machine virtuelle Java (afin de ne pas tuer un processus qui simplement réutilisé le PID d'un mort instance de mon Java démon) et puis tue le processus.
Lorsqu'il est appelé, ma méthode main() va commencer par écrire son PID dans le fichier défini dans le Système.getProperty("pidfile").
Un obstacle majeur, si: en Java, il n'est pas simple et standard pour obtenir le PID du processus de la JVM s'exécute dans.
Voici ce que je suis venu avec:
Il m'arrive fréquemment de l'écriture de scripts ou de lignes de commande qui, essentiellement, regardez comme ça, si je veux:
Profiter.
Je préfère le nohup de commande. Le blog dit qu'il y a de meilleures façons, mais je ne pense pas qu'ils soient assez de mieux.
Vous pouvez essayer de Java Service Wrapper, le community edition est gratuit et répond à vos besoins.
Cela dépend. Si c'est juste une chose une seule fois, je veux daemonize et puis rentrer à la maison, mais généralement, j'attends les résultats, je pourrais faire:
à la ligne de commande. Pour le tuer proprement, vous avez beaucoup d'options. Vous pourriez avoir un écouteur pour SIGKILL, ou écouter sur un port et d'arrêt lorsqu'une connexion est établie, vérifiez périodiquement un fichier. La différence des approches différentes ont des faiblesses. Si c'est pour une utilisation en production, je donnerais plus de la pensée, et probablement lancer un script dans /etc/init.d que nohups, et ont un plus sophistiqué de l'arrêt, tels que tomcat a.
Ma manière préférée sur Ubuntu est d'utiliser le libslack 'démon' utilitaire. C'est ce que Jenkins utilise sur Ubuntu (qui est l'endroit où j'ai eu l'idée.) Je l'ai utilisé pour mon Jetée basé sur le serveur d'applications et il fonctionne bien.
Lorsque vous arrêtez le processus de démon, il sera le signal de la machine à l'arrêt. Vous pouvez exécuter l'arrêt/nettoyage de code à ce point par l'enregistrement d'un arrêt du crochet avec de l'Exécution.addShutdownHook().
Cette question est à propos de daemonizing un programme quelconque (pas de java spécifiques) de sorte que certaines des réponses peuvent s'appliquer à votre cas:
DaemonTools :- Un nettoyant façon de gérer les services à UNIX https://cr.yp.to/daemontools.html
Installer daemon tools à partir de l'url https://cr.yp.to/daemontools/install.html
suivez les instructions mentionnées,pour tous les problèmes, s'il vous plaît essayer instructions https://gist.github.com/rizkyabdilah/8516303
Créer un fichier à /etc/init/svscan.conf et ajouter les lignes ci-dessous.(requis uniquement pour les cent-os-6.7)
Note:
remplacer le Pot avec votre propre fichier Jar. ou tout fichier de classe java.
Redémarrer le système
svstat /service/vm doit être en place dès maintenant !.
Prendre un coup d'oeil ici:
http://jnicookbook.owsiak.org/recipe-no-022/
pour un exemple de code qui est basée sur la JNI. Dans ce cas, vous daemonize le code qui a commencé comme Java et les principaux de la boucle est exécuté en C. Mais il est également possible de mettre la main, du démon, service de boucle à l'intérieur de Java.
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo029
Avoir du plaisir avec JNI!
Cela peut faire l'affaire.