Proceso Java todavía siendo asesinado

11

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.

bigubosu
fuente
Intente redirigir stdouty stderrhacia algunos archivos: su proceso puede ser anulado por una señal que no sea SIGHUP, cuando intente escribir en un terminal cerrado stdout/ stderr. Por ejemplo, agregue >/dev/null 2>&1a su comando antes de &firmar el trabajo.
Boris Burkov
1
@Bob no debería ser necesario nohup: la mayoría de las implementaciones lo harán de manera predeterminada, aunque puede ser necesario redirigir, stdinpor ejemplo </dev/null.
Graeme

Respuestas:

14

nohupsolo haga que el programa sea inmune SIGHUPy SIGQUITseñ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 debajo nohup.

La mejor solución es usar tmuxo screen, o si lo usa bash, puede intentar:

$ java -jar project.jar &
$ disown
Cuonglm
fuente
Si usa disown, debe redirigir manualmente, por ejemplo, agregar</dev/null &>/dev/null
Graeme
@Graeme: Creo que si ya no trabajamos con el shell (solo ejecutamos el comando y salimos), no hay necesidad de redirigir.
Cuonglm
Tratar ssh localhost 'sleep 10m & disown'. bashNo saldrá.
Graeme
Ok, parece ser sshque no sale si hay programas conectados al terminal. Sin embargo, lo anterior está bien si corres interactivamente.
Graeme
Las implementaciones de Linux (GNU coreutils y busybox) y BSD nohupno hacen que el comando sea inmune SIGQUIT, sino solo a SIGHUP. Eso sería explícitamente contrario al estándar y AFAIK solo puede suceder en (¿algunas versiones de?) Solaris.
mosvy
13

Otra opción más en lugar de (crónicamente disfuncional) nohup:

setsid java -jar project.jar </dev/zero &>/dev/null &

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 setsidpara más información. A diferencia de screeno tmux, este no es un programa que reclama la propiedad y continúa ejecutándose. Simplemente inicia un programa en su propio grupo de procesos .

encerrada dorada
fuente
¿Por qué nohup es disfuncional?
cpugeniusmv
@cpugeniusmv Estoy seguro de que es bueno para algo, sin embargo, no lo encontré confiable para un propósito para el que a menudo se recomienda, iniciar sesión en algún lugar, iniciar un proceso y cerrar sesión (al igual que el OP). Supongo que podría haber sido un mal uso, y tal vez setsides 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). nohupsería más flexible si potencialmente desea poner en primer plano el trabajo más adelante.
Ricitos
@ TAFKA 'goldilocks' Creo que el problema está en el manejo de stdin, stdout y stderr, que no es realmente (pero en parte (!)) Manejado por nohup. Nohup hace su trabajo principal bastante bien, protegiendo el proceso de SIGHUP. Pero hay muchas cosas que pueden salir mal con las transmisiones, o, lo que es peor, a veces salen mal, dependiendo del tamaño del búfer. Yo diría que no nohup está mal, sino la expectativa de lo que nohup hace.
Volker Siegel
-2

Intente ejecutar su nohup con STDOUT y STDERR redirigir a nulo:

nohup java -jar project.jar 2>&1 &
boris quiroz
fuente
1
Solo está redirigiendo stderr a stdout, lo que no cambia nada sobre cómo funciona nohup (redirige a ambos nohup.out).
Gilles 'SO- deja de ser malvado'
1
-1, creo que quisiste decir nohup java -jar project.jar 2>/dev/null &pero obviamente no sabes lo que estás haciendo. Aún mejor, también alimentar stdin /dev/null.
PlasmaPower
@PlasmaPower aquí tienes tu +1. Que tengas un buen día :)
boris quiroz