¿Cómo mantener los procesos en ejecución después de finalizar la sesión de ssh?

504

Digamos que lanzo varios procesos desde una sesión ssh. ¿Es posible finalizar la sesión ssh mientras se mantienen esos procesos ejecutándose en la máquina remota?

    
pregunta Olivier Lalonde 21.10.2010 - 14:09

14 respuestas

592

Deberías buscar alternativas modernas como tmux .

tmux es superior al screen por muchas razones, estos son solo algunos ejemplos:

  • Windows se puede mover entre sesiones e incluso se puede vincular a varias sesiones
  • Windows se puede dividir horizontal y verticalmente en paneles
  • Compatibilidad con terminales UTF-8 y 256 colores
  • Las sesiones se pueden controlar desde el shell sin la necesidad de ingresar a una sesión

Funcionalidad básica

Para obtener la misma funcionalidad explicada en la respuesta que recomienda screen , deberá hacer lo siguiente:

  • ssh en la máquina remota
  • start tmux escribiendo tmux en el shell
  • inicie el proceso que desea dentro de la sesión tmux iniciada
  • deja / desconecta la sesión tmux escribiendo Ctrl + b y luego d

Ahora puede cerrar la sesión de forma segura desde la máquina remota, su proceso seguirá ejecutándose dentro de tmux . Cuando vuelves y quieres verificar el estado de tu proceso, puedes usar tmux attach para adjuntarlo a tu sesión tmux .

Si desea que varias sesiones se ejecuten una al lado de la otra, debe nombrar cada sesión usando Ctrl + b y $ . Puede obtener una lista de las sesiones actualmente en ejecución usando tmux list-sessions , ahora adjunte a una sesión en ejecución con el comando tmux attach-session -t 0 .

tmux puede hacer cosas mucho más avanzadas que manejar una sola ventana en una sola sesión. Para obtener más información, eche un vistazo en man tmux o la página de tmux GitHub . En particular, aquí hay una pregunta frecuente sobre las principales diferencias entre screen y tmux .

    
respondido por el tongpu 23.11.2012 - 10:26
213

La mejor manera es a menudo la más simple.

nohup long-running-command &

Fue creado específicamente para esto, incluso registra stdout en nohup.log

man nohup

Si quiere "ejecutar en segundo plano" algunas tareas que ya se están ejecutando, entonces su mejor opción es presionar ctrl + z luego ejecutar

bg (esto borrará la tarea suspendida más reciente, lo que le permitirá seguir ejecutándose)

entonces un disown rápido debería mantener el proceso en ejecución después de cerrar la sesión.

screen y otros pueden hacerlo, pero eso no es para lo que son. Recomiendo nohup para las tareas que sabe que van a dejar atrás y bg para las tareas que ya está ejecutando y que no desea reiniciar.

Ten en cuenta que ambos son bash específicos. Si no está utilizando bash, entonces los comandos podrían ser diferentes.

    
respondido por el coteyr 28.11.2012 - 03:58
179

Puedes hacer eso usando screen .

Escriba man screen para obtener más información o lea esta página man de la pantalla .

Escenario simple:

  • ssh en su cuadro remoto. Escriba screen Luego, inicie el proceso que desea.

  • Presione Ctrl - A luego Ctrl - D . Esto "desconectará" su sesión de pantalla pero dejará sus procesos en ejecución. Ahora puede cerrar sesión en el cuadro remoto.

  • Si quiere volver más tarde, vuelva a iniciar sesión y escriba screen -r Esto "reanudará" la sesión de su pantalla, y podrá ver el resultado de su proceso.

respondido por el Lincoln 21.10.2010 - 14:20
72

La pantalla y nohup es la mejor manera, pero si tiene que separar un proceso que ya se está ejecutando sin pantalla o nohup, puede ejecutar el comando desaprobar.

  

disown [-ar] [-h] [ jobspec … | pid … ]

     

Sin opciones, elimine cada jobspec de la tabla de trabajos activos. Si se proporciona la opción -h , el trabajo no se elimina de la tabla, sino que se marca para que SIGHUP no se envíe al trabajo si el shell recibe un SIGHUP. Si jobspec no está presente, y no se incluyen la opción -a ni -r , se utiliza el trabajo actual. Si no se proporciona jobspec , la opción -a significa eliminar o marcar todos los trabajos; la opción -r sin un argumento jobspec restringe la operación a trabajos en ejecución.

Si no lo hace, puede cerrar el terminal y ejecutar el proceso en la máquina.

    
respondido por el bassgey 21.10.2010 - 15:19
37

Estaba atrapado en un mv grande, por lo que no estaba en condiciones de detener el proceso, configurar la pantalla y luego volver a iniciarla. Logré salir de la sesión ssh con el proceso ejecutándose esencialmente siguiendo los siguientes pasos:

  1. ssh [servidor]
  2. comando
  3. CTRL + Z
  4. bg
  5. desacreditar
  6. salir

El paso 3 pausa el proceso actual (por ejemplo, mi comando 'mv'). El paso 4 pone el proceso en pausa en el fondo y lo reanuda. El paso 5 te permite negar el proceso.

    
respondido por el Chaos 25.11.2013 - 04:30
19

Hay dos programas principales que puede usar para mantener los programas y el estado de la terminal en varias conexiones ssh. Son pantalla (el titular, pero desafortunadamente no se ha mantenido. Aparentemente, se está desarrollando activamente ahora ) y tmux (más nuevo, mantenido activamente). Byobu es una interfaz que puede ejecutar en la parte superior de sus sistemas y ofrece información adicional sobre el estado de ubuntu. En instalaciones nuevas utilizará tmux como back-end, si tiene una instalación anterior de byobu y una configuración existente, mantendrá el back-end anterior, ya sea en pantalla o en tmux.

Byobu

Byobu se puede instalar en la computadora al hacerlo en una máquina basada en Debian:

sudo aptitude install byobu

Usando yum, lo haces

su -c 'yum install byobu'

También es posible instalar bybu en otras distribuciones.

Usando byobu

Puede iniciar byobu ejecutando byobu en la máquina host después de conectarse usando ssh. Esto le dará un shell que se ve así:

También puede usar Byobu Terminal en una máquina Ubuntu con la opción -X y tener fácilmente un byob funcionando perfectamente.

Uso:

Comience byobu escribiendo byobu .

Puede presionar F2 para crear una nueva ventana dentro de la sesión actual, F3-F4 para alternar entre las distintas ventanas.

Lo mejor de byobu es que no tienes que matar los procesos que se ejecutan en la terminal para salir de la terminal. Simplemente puede enviar screen / tmux (el esqueleto de byobu) a un segundo plano y reanudarlo la próxima vez que venga:

  • Para salir de byobu y mantenerlo funcionando (desconectar), presione F6.
  • La próxima vez que vengas, solo haz byobu y estarás de regreso justo donde estabas.

También puedes crear varias sesiones de byobu por byobu -S session1 y así sucesivamente. Y puede conectarse con cualquiera de ellos cuando regrese.

Puedes hacer mucho más usando Byobu. Úselo! Algunas guías definitivas son aquí , aquí o aquí .

    
respondido por el SiddharthaRT 24.11.2012 - 23:09
16

No puede hacer esto una vez que el proceso haya comenzado, debe haber configurado las cosas antes de ejecutar un trabajo de larga ejecución.

Puede usar nohup , pero la sabiduría moderna sugiere que use la pantalla o bybu como su nombre de usuario para que pueda desconectarse y dejar las cosas corriendo.

La pantalla tiene la ventaja de que puede desconectarse de una máquina y volverse a conectar de otra, lo cual es útil si desea verificar los procesos de larga ejecución que se ejecutan más allá del final de la jornada laboral.

Hay una guía razonable para comenzar guide to screen aquí.

byobu pone una interfaz fácil de usar en la parte superior de la pantalla con menús, etc. También es la implementación actual de la pantalla en Ubuntu más nuevo. F2 para iniciar un nuevo terminal F3 / F4 para alternar y F6 para desconectarse. Escriba exit para terminar terminales de forma permanente.

    
respondido por el Richard Holloway 21.10.2010 - 14:16
7

Oye, aunque estoy de acuerdo en que la pantalla es la opción más efectiva. Puede usar vncserver y luego iniciar el proceso en él.

Además, si su único interés es que el proceso se ejecute y no sea necesario volver a controlarlo, y lo más importante es que no estaba consciente de que tendrá que cerrar la sesión y ya tiene el proceso en ejecución, no está de suerte si usaste bash como caparazón

Primero debe enviar el proceso a segundo plano al presionar Ctrl + Z seguido de bg% 1 (el número depende del número de trabajo, generalmente es 1, pero puede obtener fácilmente la lista usando los trabajos de comando)

Por último, invocar el rechazo del comando (seguido del jobid ... lo mismo que con el comando bg)

Esto eliminará la relación padre-hijo entre tu caparazón y el proceso en segundo plano, evitando que muera cuando tu caparazón finalice.

    
respondido por el Jorge Gutierrez 06.06.2011 - 23:29
7

Para un único script de shell que he ejecutado durante un largo período de tiempo, iniciaré sesión y ejecutaré el proceso en segundo plano usando '& amp;'.

Ejemplo:

/path/to/my/script &

Cerré sesión y desconecté mi sesión SSH. Cuando inicio sesión más tarde, el script aún se está ejecutando, como lo demuestra la recopilación continua de datos del script.

    
respondido por el user108430 29.07.2014 - 16:58
3

Debería consultar la pantalla de GNU y ver si le sirve de ayuda. Dependiendo de cómo necesite que su aplicación se ejecute en tiempo real, puede causar más problemas de los que resuelve, pero al menos le permitirá reanudar su sesión como si nunca la hubiera dejado.

Cómo usar:

  • Use el comando screen para el primer inicio, desplácese por los mensajes de presentación, se le debe entregar un terminal.
  • C-a C-c abre otra terminal
  • C-a C-k mata a un terminal
  • Puede usar C-a C-Space y C-a C-Backspace para pasar por los terminales
  • C-a C-a es útil si usa principalmente dos terminales
  • C-a C-d desconecta la sesión de pantalla actual y sale de las pantallas. Luego puede usar screen -r para reanudar esa sesión. Puede tener varias sesiones de pantalla separadas a la vez, en este caso se le mostrará una lista de sesiones disponibles.

Hay muchas otras opciones, por ejemplo, pantallas divididas, y también todos los accesos directos son totalmente personalizables.

    
respondido por el T. Verron 22.05.2012 - 17:31
2

Respuesta más simple ...

ctrl + z suspenderá el programa en ejecución

"bg" lo ejecutará en segundo plano

    
respondido por el Roop 13.08.2013 - 02:28
2

La forma más fácil es ejecutar el comando en segundo plano con & . Entonces solo escribe:

disown -a
    
respondido por el Zibri 11.01.2017 - 04:52
0

Mientras todo el mundo dice usar disown (la única opción que tienes después de que ya hayas comenzado el proceso), nohup , o incluso ejecutar el comando en screen , que es útil si quieres ver toda la salida desde el comando ... soy fanático de screen .. Todavía he probado las distribuciones más recientes de Linux y simplemente poner el trabajo en segundo plano y dejar de fumar no causa que todos los procesos que se ejecutan mueran. Debe haber un entorno global o algo así. Estoy probando esto en algunos sistemas bastante antiguos (slackware 12) y mi script de prueba se ejecuta hasta que lo mato manualmente:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Aunque estoy de acuerdo en que screen sería la mejor manera de ejecutar esto, incluso si mi script escribió en archivos de registro o lo que sea ... Nunca he necesitado usar disown -a o nohup a menos que haya salido de completa la paranoia. Tal vez alguien puede arrojar algo de luz sobre cómo se comporta bash por defecto? Tal vez algunos administradores del sistema cambien los valores predeterminados en las grandes conchas para evitar que los procesos de los usuarios sobrecarguen el sistema.

    
respondido por el Dan Gullage 29.07.2015 - 19:42
-1

En lugar de:

cmd options; 

Agregar antes de nohup :

nohup cmd options & 

Luego, podrá ver la salida estándar de la consola de la siguiente manera:

tail -f nohup.out
    
respondido por el Abdennour TOUMI 22.10.2016 - 12:51

Lea otras preguntas en las etiquetas