Mantenga las sesiones SSH ejecutándose después de la desconexión

208

A veces tengo procesos de larga ejecución que quiero iniciar antes de volver a casa, así que creo una sesión SSH en el servidor para comenzar el proceso, pero luego quiero cerrar mi computadora portátil y volver a casa y más tarde, después de la cena, quiero verifique el proceso que comencé antes de dejar el trabajo. ¿Cómo puedo hacer eso con SSH? Según tengo entendido, si interrumpe su conexión SSH, también interrumpirá su sesión de inicio de sesión en el servidor, lo que anulará el largo proceso de ejecución.

λ Jonas Gorauskas
fuente

Respuestas:

205

Use nohuppara hacer que su proceso ignore la señal de bloqueo:

$ nohup long-running-process &
$ exit
Warren Young
fuente
20
Eso es todo. No es necesario instalar la pantalla o tmux. Esta es realmente la buena forma de hacerlo. Claro que 'screen' o 'tmux' son aplicaciones maravillosas y deben usarse cuando sea necesario, pero tan simple como ejecutar un proceso en segundo plano desde el cual puede cerrar sesión, vaya a lo anterior.
reiche
2
No es como Desown?
cjac
28
Tienen propósitos similares, pero difieren en muchos aspectos. nohupintercepta SIGHUP para que cuando el shell que lo ejecutó se cierre y envíe SIGHUP a todos sus hijos que aún están corriendo, long-running-processno muera. disownsimplemente elimina el trabajo especificado de la lista secundaria de Bash, por lo que no intentará enviar SIGHUP en absoluto. nohupes un programa separado del shell, por lo que funciona con todos los shells, mientras que disownes un Bash incorporado. nohupacepta el comando para ejecutarse, mientras que disownsolo funciona después de que se inicia el trabajo y lo ha puesto en segundo plano para que pueda volver al shell.
Warren Young
3
Impresionante revisión rápida para aquellos que no están familiarizados con nohup y disown, así como algunas formas fáciles de lidiar con las sesiones de terminal serverwatch.com/tutorials/article.php/3935306/…
Dan
77
tail -f nohup.outpara ver qué pasa cuando vuelvas.
Ricardo Stuven el
141

Desea estar usando la pantalla GNU. ¡Es súper increíble!

ssh [email protected]
screen               #start a screen session
run-a-long-process

CTRL+ a, dpara desconectarse de su sesión de pantalla

exit                 #disconnect from the server, while run-a-long-process continues

Cuando regrese a su computadora portátil:

ssh [email protected]
screen -r            #resume the screen session

¡Entonces mira el progreso de tu largo proceso!

screenes una herramienta muy completa y puede hacer mucho más de lo que he descrito. Mientras está en una sesión de pantalla, intente ctrl + a ,? para aprender algunos comandos comunes. Probablemente los más comunes son:

  • CTRL+ a, cpara crear una nueva ventana
  • CTRL+ a, npara cambiar a la siguiente ventana en su sesión de pantalla
  • CTRL+ a, ppara cambiar a la ventana anterior en su sesión de pantalla
  • Si inicia sesión desde un grupo de sistemas diferentes, es posible que se haya quedado conectado accidentalmente a una sesión de pantalla activa en una computadora diferente. por esa razón, siempre reanudo screen -d -rpara asegurarme de que si se conecta otro shell a mi sesión de pantalla, se desconectará antes de reanudarlo en mi sistema actual.
Arenoso
fuente
8
tmux es un análogo moderno de pantalla.
zvolkov
No sé sobre moderno, pero el prefijo de tecla predeterminado de tmux (Ctrl + b) ayuda si está acostumbrado a las teclas bash / emacs.
sajith
2
la pantalla es genial si quieres un terminal compartido por alguna razón. Crea una pantalla screen -S namey deja que tu otro amigo se conecte a ella screen -x name.
Patrick
1
tmuxwith tmuxinatores una gran combinación para configuraciones sofisticadas, mientras que prefiero screenuna solución rápida y simple.
earthmeLon
Esta respuesta es la mejor ... me gusta. Excelente investigación
Jaffer Wilson
42

Si no ha planeado con anticipación y la configuración screen, etc. simplemente haga lo siguiente:

  1. Si su proceso se ejecuta en segundo plano: pase al # 3, de lo contrario: Ctrl-Zsuspenda el proceso en primer plano. Esto informará el número de trabajo del proceso suspendido, por ejemplo:

    [1]+  Stopped                 processName
    
  2. Envíe processNameal fondo con bg %1(usando el número de trabajo que sigue al %). Esto se reanudará processNameen el fondo.

  3. Desconocido processName con disown %1o disown PID. Use la -hbandera si desea mantener la propiedad hasta que finalice su shell actual.

Mike Covington
fuente
55
¡Gracias por esto! Tenía un trabajo en marcha y pensé que no iba a poder mantenerlo en marcha porque no lo había usado &cuando lo comencé. ¡Esto parece funcionar muy bien!
Matt
44
¡Esto es increíble! Nunca supe que Linux podría permitirle transferir el control de procesos activos como este. Tenía miedo de que mi batería se agotara mientras SSH entraba en mi servidor en medio de un proceso de larga ejecución, ¡y esta fue la respuesta para mí!
Plutón
14

Lo que desea usar es la pantalla o, mejor aún, un contenedor fácil de usar alrededor de la pantalla llamado byobu.

Screen le permite ejecutar múltiples sesiones de terminal virtual en la misma sesión ssh. Un tutorial y páginas de ayuda están disponibles.

byobu es un contenedor que permite abrir fácilmente nuevas pantallas con una simple tecla de función en lugar de la combinación de teclas de ctrl-a. También muestra una línea de estado con todos los terminales virtuales abiertos que se pueden nombrar.

Otra característica interesante es el hecho de que toda su pantalla puede permanecer activa mientras su conexión ssh está desconectada. Simplemente se conecta de nuevo a través de ssh y llama a byobu y todo es como antes.

Por fin algunas capturas de pantalla de byobu.

txwikinger
fuente
Lancé un proceso en mi servidor dentro de Byobu Terminal sin saber realmente qué era (solo busqué en Terminal y hice clic en Byobu porque nunca lo había visto antes). Seguí usando Byobu porque tenía una barra de estado colorida en la parte inferior y pensé que era genial. Hoy me encontré con ganas de acceder a esa sesión de terminal de forma remota a través de SSH. Todo lo que tuve que hacer fue escribir "byobu" y mostró esa sesión terminal de inmediato. Muy feliz me encontré con byobu!
nick
8

Vale la pena señalar que

ssh -t lala screen -rxU moose adjuntará a la sesión de moo en el host lala

ssh -t lala screen -S moocreará la sesión de moo en el host lala

y

ssh -t lala screen -S moo quuxcreará la sesión moo en host lala y ejecutará el programa quux , cerrando la sesión al finalizar.

cjac
fuente
3

Antigua pregunta, extraña aún, nadie aconsejó a tmux , que actúa como envoltorio para n consolas y las mantiene abiertas hasta que sea necesario. Esto permite un mayor control, además de una serie de funciones que tiene tmux. Es fácil de administrar, solo ejecuta tmux, que lo lleva a su shell, inicia su trabajo, luego presiona ctrl + b seguido de d (detach) ( ctrl+bes el "ok google" de tmux, y des el comando para cerrar sin salida de la cáscara). Esto realmente funciona si solo cierras, por ejemplo, masilla. Después de la cena, cuando vuelva a conectarse, puede volver a abrir tmux tmux attachpara ver su pantalla exactamente como la dejó. Algo que me encanta es dividir el panel: ctrl+by luego presionar ". Para cambiar de un panel a otro, ctrl+by luego presione la flecha arriba / abajo.

sin sentido
fuente
3

Puede encontrar una buena guía aquí: Mantenga su sesión SSH ejecutándose cuando se desconecte

sudo apt-get install screen

Ahora puede comenzar una nueva sesión de pantalla simplemente escribiendo screen en la línea de comando. Se le mostrará información sobre la pantalla. Presiona enter, y estarás en un mensaje normal.

Para desconectarse (pero dejar la sesión en ejecución) Presione Ctrl+ Ay luego Ctrl+ Den sucesión inmediata. Verá el mensaje [separado]

Para volver a conectarse a una sesión que ya se está ejecutando

screen -r

Para volver a conectarse a una sesión existente, o crear una nueva si no existe

screen -D -r

Para crear una nueva ventana dentro de una sesión de pantalla en ejecución, presione Ctrl+ Ay luego Cen sucesión inmediata. Verá un nuevo aviso.

Para cambiar de una ventana de pantalla a otra Hit Ctrl+ Ay luego Ctrl+ Aen sucesión inmediata.

Para enumerar las ventanas de pantalla abierta, presione Ctrl+ Ay luego Wen sucesión inmediata

Victor Hugo Arango A.
fuente
Puede usar <kbd>Ctrl</kbd>para mostrar los nombres como teclas del teclado.
Tomasz
1

Uso NX NoMachine, que es gratis para mí porque solo soy yo. Básicamente, ejecuta una sesión X en el servidor que puede conectar y desconectar una y otra vez. La sesión X sigue ejecutándose cuando no estás conectado. Las conexiones se pueden hacer desde cualquier lugar. Puede elegir entre ventanas flotantes o una sola ventana que contiene un escritorio completo (por ejemplo, un escritorio Gnome completo). El cliente (que ejecutaría en su computadora portátil) puede ejecutarse en Linux, MacOS, Solaris o Microsoft Windows. En el último caso, si elige ventanas flotantes, aparecerán individualmente en la barra de tareas de Windows.

Uso mi computadora portátil Windows XP (que necesito para cierto hardware específico de Windows que tengo) como interfaz para mis dos servidores Linux que usan NX Nomachine. Incluso puedo imprimir en la impresora conectada a mi computadora portátil con Windows desde Linux.

Rob_before_edits
fuente