75 votes

Comment démoniser 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?

37voto

Bahaa Zaid Points 894

Apache Daemon exécutera votre programme Java en tant que démon Linux ou service WinNT.

32voto

Varkhan Points 6756

Si vous ne pouvez pas compter sur Java Service Wrapper cité ci-dessus (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

logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1

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: en Java, il n'est pas simple et standard pour obtenir le PID du processus de la JVM s'exécute.

Voici ce que j'ai:

private static String getPid() {
    File proc_self = new File("/proc/self");
    if(proc_self.exists()) try {
        return proc_self.getCanonicalFile().getName();
    }
    catch(Exception e) {
        /// Continue on fall-back
    }
    File bash = new File("/bin/bash");
    if(bash.exists()) {
        ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","echo $PPID");
        try {
            Process p = pb.start();
            BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));
            return rd.readLine();
        }
        catch(IOException e) {
            return String.valueOf(Thread.currentThread().getId());
        }
    }
    // This is a cop-out to return something when we don't have BASH
    return String.valueOf(Thread.currentThread().getId());
}

25voto

Ben Hardy Points 951

Il m'arrive fréquemment de l'écriture de scripts ou de lignes de commande qui, essentiellement, regardez comme ça, si je veux:

  1. Exécutez un programme qui est à l'abri de sighups
  2. C'est complètement déconnectée de la coquille, qui engendre, et
  3. Produit un fichier de log stderr et stdout dont les contenus sont affichés en tant que bien, mais
  4. Me permet de m'arrêter l'affichage de l'historique en cours, et de faire d'autres choses sans perturber le processus en cours d'exécution

Profitez de.

nohup java com.me.MyProgram </dev/null 2>&1 | tee logfile.log &

15voto

S.Lott Points 207588

Je préfère la commande nohup . Le billet de blog dit qu'il existe de meilleures méthodes, mais je ne pense pas qu'elles soient suffisamment meilleures.

5voto

John T Points 14067

Vous pouvez essayer Java Service Wrapper , l'édition de la communauté est gratuite et répond à vos besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X