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.

stdoutystderrhacia 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>&1a 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,stdinpor ejemplo</dev/null.Respuestas:
nohupsolo haga que el programa sea inmuneSIGHUPySIGQUITseñ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
tmuxoscreen, o si lo usabash, puede intentar:fuente
disown, debe redirigir manualmente, por ejemplo, agregar</dev/null &>/dev/nullssh localhost 'sleep 10m & disown'.bashNo saldrá.sshque no sale si hay programas conectados al terminal. Sin embargo, lo anterior está bien si corres interactivamente.nohupno 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 setsidpara más información. A diferencia descreenotmux, 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
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.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.