Come eseguire un file jar all'avvio e quando ci si disconnette?


30

Non ho idea di dove iniziare a cercare. Ho letto dei demoni e non ho capito il concetto.

Più dettagli :

  • Ho scritto un crawler che non si ferma mai e crawler su RSS in Internet.
  • Il crawler è stato scritto in java - quindi è un barattolo in questo momento.
  • Sono un amministratore su una macchina che ha Ubuntu 11.04.
  • Ci sono alcune possibilità che la macchina si arresti in modo anomalo, quindi vorrei che il crawler funzionasse ogni volta che avvii la macchina.
  • Inoltre, mi piacerebbe che continuasse a funzionare anche quando mi sono disconnesso. Non sono sicuro che sia possibile, ma la maggior parte delle volte sono disconnesso e voglio ancora eseguirne la scansione.

Qualche idea? Qualcuno può indicarmi la giusta direzione?

Sto solo cercando la soluzione più semplice.

Risposte:


32

Ecco un modo semplice per farlo utilizzando SysVInit. Istruzioni:

  1. Crea lo script start e stop della tua applicazione. Mettilo in qualche directory, nel nostro esempio è:

    • Inizia script: /usr/local/bin/myapp-start.sh
    • Stop Script: /usr/local/bin/myapp-stop.sh

    Ognuno fornirà le istruzioni per eseguire / arrestare l'app. Ad esempio, il myapp-start.shcontenuto può essere semplice come il seguente:

    #!/bin/bash
    
    java -jar myapp.jar 

    Per lo script stop può essere qualcosa del genere:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
  2. Crea il seguente script ( myscript) e mettilo /etc/init.d.

    /etc/init.d/myscript soddisfare:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
  3. Inserisci lo script per iniziare con il sistema (usando SysV). Basta eseguire il seguente comando ( come root ):

    update-rc.d myscript defaults 

PS: So che Upstart è eccezionale e bla bla, ma preferisco il vecchio sistema di inizializzazione SysV.


1
Ma come farà il sistema a sapere quale parametro utilizzerà? Come impostare come "inizio". Ho provato qui e non ha funzionato.
John John Pichler,

1
Funziona, ma il comando "service myapp start" non esce dal comando.
Tobia,

Ora come usare le opzioni start | stop | restart in myscript?
Codevalley,

Inoltre, anche dopo aver eseguito i 3 passaggi, il mio vaso non è in esecuzione all'avvio. Sei sicuro di dover modificare le autorizzazioni, il percorso o qualcosa del genere?
Codevalley,

@Codevalley, come ho già detto, questo metodo è per l'inizializzazione SysV. Per utilizzare il servizio o altri comandi è necessario scrivere un processo di avvio. Ma se hai intenzione di farlo, dovresti scriverne uno systemd (dal momento che sta diventando lo standard)
Marcos Roriz Junior

6

Sì! È possibile. :) Upstart è la strada da percorrere per assicurarsi che il servizio rimanga attivo. Ha cinque pacchetti, tutti installati per impostazione predefinita:

  • Avvia il demone init e l'utilità initctl
  • upstart-logd fornisce il demone logd e il file di definizione lavoro per il servizio logd
  • upstart-compat-sysv fornisce file di definizione lavoro per le attività rc e gli strumenti di riavvio, runlevel, arresto e telinit che forniscono compatibilità con SysVinit
  • startup-task fornisce file di definizione lavoro per le attività di avvio del sistema
  • system-services fornisce file di definizione lavoro per i servizi tty

L'apprendimento è molto divertente e ne vale la pena. Upstart ha un sito Web: http://upstart.ubuntu.com/


Dal sito Web Upstart, a partire dal 2019: "Il progetto è solo in modalità di manutenzione. Non sono state sviluppate nuove funzionalità e il consiglio generale sarebbe di passare a un altro sistema o systemd minimo"
Nav

2

3 suggerimenti rapidi ...

  1. Crea uno script S tart in /etc/rc3.d(modalità console multiutente) con gli script K ill corrispondenti /etc/rc.0e /etc/rc6.duccidi il tuo programma Java in modo controllato quando il sistema si spegne (runevel 0) o si riavvia (runlevel 6) Vedi un'introduzione a Runlevels .

    Potresti essere in grado di avviare la tua app Java nel runlevel 2 (rc2.d) ma, come crawler, avrà bisogno del TCP / IP. Quindi assicurati che il tuo servizio di rete sia disponibile / avviato nel tuo runlevel 2 in anticipo. La rete è decisamente migliorata nel runlevel 3.

    /etc/init.dcontiene tutti gli script start / kill effettivi. /etc/rcN.dle directory contengono solo collegamenti a loro, con il prefisso S o K per avviarli o ucciderli rispettivamente, per runlevel N.

  2. Un processo eseguito cronddovrebbe persistere tra i logout. Magari aggiungilo al tuo crontab.

  3. Un processo eseguito con nohupdovrebbe anche persistere. Vedi nohup: esegui un comando anche dopo il logout .

    $ nohup java -jar myapp.jar &

    Per impostazione predefinita, myapp.jarl'output standard andrà a un file denominato ./nohup.outo $HOME/nohup.outse il primo non è scrivibile.


E quando esco, funzionerà ancora in background?
RanZilber,

0

Fai anche attenzione quando fai delle domande con:

  update-rc.d myscript defaults 

Per avere i permessi 0755 e usare o ottenere prima del tuo .sh il percorso. Supponiamo che il tuo script sia su /root/test.sh, dovresti prima cambiare su CD /root/prima di accedere test.sh.

Quindi il modo migliore è fare un SH su init.d e lì cambiare il percorso verso il tuo shed eseguirlo nella funzione start.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.