Esegui il file jar java su un server come processo in background


105

Ho bisogno di eseguire un java jar nel server per poter comunicare tra due applicazioni. Ho scritto due script di shell per eseguirlo, ma una volta avviato lo script non posso arrestare / terminare il processo. Se premo ctrl+ Co chiudo la console, il server si spegnerà. Qualcuno potrebbe aiutarmi a modificare questo script per eseguirlo come un normale server?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid

Risposte:


242

Puoi provare questo:

#!/bin/sh
nohup java -jar /web/server.jar &

Il simbolo & cambia il programma da eseguire in background.

L'utility nohup fa eseguire in background il comando passato come argomento anche dopo il logout.


Grazie Anton, attualmente sto fermando il server uccidendo il processo id. Non credo sia la migliore pratica. È il comando per fermare il server?
Bernad Ali

3
Risposta breve: dipende dal server. Risposta lunga: per quanto ne so, non esiste un modo sicuro per interrompere un processo senza che il processo supporti tali arresti graziosi. Ad esempio, se si tratta di un server web che viene terminato da un segnale esterno, c'è sempre la possibilità che alcune richieste vadano perse. Un modo per risolvere questo problema è implementare una graziosa funzione di terminazione nel server stesso, ad esempio elaborando un tipo speciale di richieste. Quindi, il server può essere terminato inviandogli una richiesta di quel tipo speciale. Altrimenti, uccidere il processo tramite il suo ID è il modo più semplice.
Anton Beloglazov

1
L'uso nohupdovrebbe sempre essere combinato con il reindirizzamento esplicito di stdout e stderr, altrimenti non si ha il controllo di dove vanno i log e si finisce con un brutto nohup.outcreato in qualsiasi directory da cui viene richiamato questo script.
Charles Duffy

@Anton quando eseguo uno script (proprio come la tua risposta) con SSH EXEC runjar.sh. Ha iniziato a trasmettere i log nel mio terminale locale e se si chiude il mio terminale il mio jar viene ucciso. Come posso eseguire un jar in background usando SSH EXEC?
AATHITH RAJENDRAN

47

Systemd che ora viene eseguito nella maggior parte delle distribuzioni

Passo 1:

Trova i tuoi servizi definiti dall'utente in cui si trovava il mio /usr/lib/systemd/system/

Passo 2:

Crea un file di testo con il nome del tuo editor di testo preferito whatever_you_want.service

Passaggio 3:

Metti il ​​seguente modello nel filewhatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

Passaggio 4:

Esegui il tuo servizio
come super utente

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service

Questo è il modo moderno di farlo
EarthMind,

4
sull'immagine ubutnu di aws ho dovuto installare systemd, quindi ho trovato l'immagine in / etc / systemd / system /
Robbo_UK

29

Se stai usando Ubuntu e hai "Upstart" ( http://upstart.ubuntu.com/ ) puoi provare questo:

Creare /var/init/yourservice.conf

con il seguente contenuto

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

Ora puoi emettere i comandi service yourservice starte service yourservice stop. Puoi eseguire la coda /var/log/yourservice.logper verificare che funzioni.

Se vuoi solo eseguire il tuo jar dalla console senza che monopolizzi la finestra della console, puoi semplicemente fare:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1

3
È un servizio di systemd? Questa domanda non è contrassegnata come linux e pochissime distribuzioni hanno systemd per impostazione predefinita.
jordanm

1
Modificherò la domanda per dire che sta usando "upstart" che è incluso in Ubuntu.
Strelok

1
Credo per l'ultimo consiglio se vuoi che venga eseguito in background e la shell sia stata rilasciata, dovresti fare: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro

Tutti i lavori di sistema per impostazione predefinita risiedono nella seguente directory: / etc / init / ... Per impostazione predefinita, non esiste alcuna directory / var / init / in Ubuntu 14.04.
Michael Lafayette

Inoltre, l'avvio di un servizio richiede "sudo". sudo service yourservice start
Michael Lafayette

2

Esegui in background e aggiungi registri al file di registro utilizzando quanto segue:

nohup java -jar /web/server.jar > log.log 2>&1 &
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.