Domanda

Ho un programma Java che mi piacerebbe eseguito come demone su un sistema Linux. In altre parole, voglio iniziare a correre in un guscio e hanno procedi in esecuzione dopo che ho disconnesso. Voglio anche essere in grado di fermare il programma in modo pulito.

questo articolo che utilizza un combinazione di scripting di shell e il codice Java per fare il trucco. Sembra buono, ma mi piacerebbe qualcosa di più semplice, se possibile.

Qual è il tuo metodo preferito per demonizzare un programma Java su un sistema Linux?

È stato utile?

Soluzione

Apache Commons Daemon verrà eseguito il programma Java come demone Linux o servizio WinNT.

Altri suggerimenti

Se non è possibile fare affidamento su Java Servizio Wrapper citato elsewhere (per esempio, se si esegue su Ubuntu, che non ha la versione pacchettizzata di SW) che probabilmente vuole farlo alla vecchia maniera: avere il vostro programma di scrittura il suo PID in /var/run/$progname.pid, e scrivere uno script SysV standard (uso per esempio quello per ntpd come esempio, è semplice) intorno ad esso. Preferibilmente, lo rendono LSB-compliant, anche.

Essenzialmente, i test di funzionalità inizio se il programma è già in esecuzione (verificando se esiste /var/run/$progname.pid, e il contenuto di tale file è il PID di un processo in esecuzione), e se non si eseguono

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

La funzione controlla fermata su /var/run/$progname.pid, test se questo file è il PID di un processo in esecuzione, verifica che si tratta di una Java VM (in modo da non uccidere un processo che semplicemente riutilizzato il PID da un'istanza morta del mio demone Java) e poi uccide quel processo.

Quando viene chiamato, il mio metodo main () inizierà scrivendo il suo PID nel file definito System.getProperty ( "pidfile").

Un ostacolo importante, però:. In Java, non esiste un modo semplice e standard per ottenere il PID del processo JVM viene eseguito in

Ecco quello che sono venuto su con:

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());
}

Mi capita spesso di ritrovo a scrivere script o righe di comando che essenzialmente assomigliano a questo, se voglio:

  1. Esegui un programma che è immune da sighups
  2. Questo è completamente scollegato dalla shell che genera, e
  3. Produce un file di log da stderr e stdout il cui contenuto vengono visualizzati come pure, ma
  4. mi permette di interrompere la visualizzazione del registro in corso e fare altre cose senza interrompere il processo in esecuzione

Enjoy.

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

Io preferisco il href="http://linux.die.net/man/1/nohup" rel="noreferrer"> nohup comando

Si potrebbe provare a Java Servizio Wrapper , la Community Edition è gratuita e si riunisce le vostre esigenze.

Dipende. Se è solo una cosa di una volta, voglio demonizzare e poi tornare a casa, ma di solito attendere i risultati, potrei fare:

nohup java com.me.MyProgram &

nella riga di comando. Per uccidere in modo pulito, hai un sacco di opzioni. Si potrebbe avere un listener per SIGKILL, o ascoltare su una porta e l'arresto quando viene stabilita una connessione, controllare periodicamente un file. approcci di differenza hanno diversi punti deboli. Se è per l'uso in produzione, mi piacerebbe dare più pensiero, e probabilmente gettare uno script in /etc/init.d che nohups esso, e hanno un arresto più sofisticato, come quello che ha Tomcat.

Il mio modo preferito su Ubuntu è quello di utilizzare l'utilità libslack 'demone'. Questo è ciò che Jenkins utilizza su Ubuntu (che è dove ho avuto l'idea.) Ho usato per i miei applicazioni server Jetty-based e funziona bene.

Quando si arresta il processo demone che segnalerà alla JVM di arresto. È possibile eseguire l'arresto codice / pulitura a questo punto per la registrazione di un gancio di arresto con Runtime.addShutdownHook ().

Questa domanda è di circa daemonizing un programma arbitrario (non-java specifico) per cui alcune delle le risposte possono applicare al vostro caso:

DaemonTools: - un modo più pulito per gestire i servizi in UNIX https://cr.yp.to/daemontools .html

  1. Installa DAEMON Tools dal https://cr.yp.to/daemontools /install.html seguire le istruzioni menzionato lì, per eventuali problemi riprova istruzioni https://gist.github.com/rizkyabdilah/8516303

  2. Crea un file a /etc/init/svscan.conf e aggiungere le righe seguenti. (Richiesto solo per cent-os-6.7)

 start on runlevel [12345]
 stop on runlevel [^12345]
 respawn
 exec /command/svscanboot
  1. Crea un nuovo script chiamato / / cartella eseguire all'interno / servizio vm e aggiungere le righe seguenti.
#!/bin/bash    
echo starting VM 
exec java -jar
/root/learning-/daemon-java/vm.jar

Nota:    sostituire il Vaso con un tuo file Jar. o qualsiasi file di classe Java.

  1. Riavviare il sistema

  2. svstat / servizio / vm dovrebbe essere installato e funzionante ora!.

  3. SVC -d / servizio / vm vm dovrebbe portare verso il basso ora!.
  4. SVC -u / servizio / vm dovrebbe portare vm ora!.

Date un'occhiata qui:

http://jnicookbook.owsiak.org/recipe-no-022/

per un esempio di codice che si basa su JNI. In questo caso è eseguito come demone il codice che è stato avviato come Java e ciclo principale viene eseguito in C. Ma è anche possibile mettere principale, il demone, ciclo di servizio all'interno di Java.

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo029

Buon divertimento con JNI!

nohup java -jar {{your-jar.jar}} > /dev/null &

Questo può fare il trucco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top