C'è una cosa fondamentale che devi fare dopo aver aggiunto un &
alla fine del comando. Il processo è ancora collegato al terminale. Devi eseguire disown
dopo aver eseguito il comando java.
java -jar yourApp.jar > log.txt &
disown
Ora puoi chiudere il terminale.
Esistono diversi modi per ottenere una cosa del genere:
nohup java -server myApplication.jar > /log.txt
- Questo è piuttosto semplice. Metterà semplicemente l'applicazione in background. Funzionerà, ma non è un ottimo modo per farlo.- Utilizza uno shell wrapper e l'app daemon OR di cui sopra. Questo approccio è utilizzato da molti progetti open source ed è abbastanza buono per la maggior parte degli scenari. Inoltre può essere incluso in
init.d
e livello di esecuzione richiesto con comandi regolari di avvio, arresto e stato. Posso fornire un esempio se necessario. - Crea il tuo server daemon utilizzando Java Service Wrapper o Apache Jakarta Commons Daemon. Ancora una volta, entrambi sono estremamente popolari, ben testati e affidabili. E disponibile sia per Linux che per Windows! Quello di Apache Commons è usato dal server Tomcat! Inoltre c'è Akuma.
Personalmente sceglierei la soluzione 2 o 3 se hai bisogno di utilizzare questo server in futuro e/o distribuirlo a clienti, utenti finali, ecc. nohup
va bene se hai bisogno di eseguire qualcosa e non hai tempo per sviluppare una soluzione più complessa per il problema.
Annuncio 2:
I migliori script, utilizzati da molti progetti, possono essere trovati qui.
Per Debian/Ubuntu si può usare uno script molto semplice basato su start-stop-daemon
. In caso di dubbio c'è /etc/init.d/skeleton
si può modificare.
#!/bin/sh
DESC="Description"
NAME=YOUR_NAME
PIDFILE=/var/run/$NAME.pid
RUN_AS=USER_TO_RUN
COMMAND=/usr/bin/java -- -jar YOUR_JAR
d_start() {
start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --exec $COMMAND
}
d_stop() {
start-stop-daemon --stop --quiet --pidfile $PIDFILE
if [ -e $PIDFILE ]
then rm $PIDFILE
fi
}
case $1 in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
restart)
echo -n "Restarting $DESC: $NAME"
d_stop
sleep 1
d_start
echo "."
;;
*)
echo "usage: $NAME {start|stop|restart}"
exit 1
;;
esac
exit 0