Necesito ejecutar un programa Java en los servidores de mi universidad. Estoy iniciando sesión remotamente a través de sus servidores a través de ssh
Entonces usé nohup así:
nohup java -jar project.jar &
Sin embargo, cuando cierro la sesión y cierro el terminal y luego vuelvo a iniciar sesión en el servidor, falta mi proceso / me mataron.
stdout
ystderr
hacia algunos archivos: su proceso puede ser anulado por una señal que no sea SIGHUP, cuando intente escribir en un terminal cerradostdout
/stderr
. Por ejemplo, agregue>/dev/null 2>&1
a su comando antes de&
firmar el trabajo.nohup
: la mayoría de las implementaciones lo harán de manera predeterminada, aunque puede ser necesario redirigir,stdin
por ejemplo</dev/null
.Respuestas:
nohup
solo haga que el programa sea inmuneSIGHUP
ySIGQUIT
señal. El shell moderno puede enviar otras señales cuando cierra la sesión de su sesión, por lo que no hay garantía de que su programa no se elimine, incluso si se ejecuta por debajonohup
.La mejor solución es usar
tmux
oscreen
, o si lo usabash
, puede intentar:fuente
disown
, debe redirigir manualmente, por ejemplo, agregar</dev/null &>/dev/null
ssh localhost 'sleep 10m & disown'
.bash
No saldrá.ssh
que no sale si hay programas conectados al terminal. Sin embargo, lo anterior está bien si corres interactivamente.nohup
no hacen que el comando sea inmuneSIGQUIT
, sino solo aSIGHUP
. Eso sería explícitamente contrario al estándar y AFAIK solo puede suceder en (¿algunas versiones de?) Solaris.Otra opción más en lugar de (crónicamente disfuncional)
nohup
:Esto efectivamente "demoniza" el proceso. Ahora es propiedad de init, por lo que nunca recibirá HUP, sus transmisiones de E / S son seguras y se ha bifurcado en segundo plano.
Ver
man setsid
para más información. A diferencia descreen
otmux
, este no es un programa que reclama la propiedad y continúa ejecutándose. Simplemente inicia un programa en su propio grupo de procesos .fuente
setsid
es una prueba un poco más idiota de esta manera. Se salta un paso implicado por nohup (haciendo que el proceso vuelva a ser parental por init como huérfano).nohup
sería más flexible si potencialmente desea poner en primer plano el trabajo más adelante.Otra idea sería usar el comando de pantalla. Es posible iniciar un programa con la pantalla, desconectar y cerrar sesión. Luego puede iniciar sesión y adjuntar a la sesión de la pantalla en ejecución.
Tutorial: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/
fuente
Intente ejecutar su nohup con STDOUT y STDERR redirigir a nulo:
fuente
nohup.out
).nohup java -jar project.jar 2>/dev/null &
pero obviamente no sabes lo que estás haciendo. Aún mejor, también alimentarstdin
/dev/null
.