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

Digamos que lanzo un montón de procesos desde una sesión SSH. ¿Es posible terminar la sesión SSH mientras se mantienen esos procesos en ejecución en la máquina remota?

Deberías buscar alternativas modernas como tmux.

tmux es superior a screen por muchas razones, aquí hay solo algunos ejemplos:

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

Funcionalidad Básica

Para obtener la misma funcionalidad que se explica en el respuesta recomendar screen, tendría que hacer lo siguiente:

  • ssh en la máquina remota
  • empezar tmux escribiendo tmux en el shell
  • inicie el proceso que desee dentro de la aplicación tmux sesion
  • deje/separe el tmux sesión escribiendo Ctrl+b y luego d

Ahora puede cerrar sesión de forma segura en la máquina remota, su proceso seguirá ejecutándose en el interior tmux. Cuando regrese y desee verificar el estado de su proceso, puede usar tmux attach para adjuntar a su tmux sesion.

Si desea que varias sesiones se ejecuten una al lado de la otra, debe nombrar cada sesión con Ctrl+b y $. Puede obtener una lista de las sesiones que se están ejecutando actualmente mediante tmux list-sessions, ahora adjúntelo a una sesión en ejecución con el comando tmux attach-session -t <session-name>.

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 GitHub de tmux. Especialmente, aquí hay una pregunta frecuente sobre las principales diferencias entre screen y tmux.

Opción 1: nohup

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

nohup long-running-command &

Fue hecho específicamente para esto, incluso registra stdout a nohup.log.

man nohup

Opción 2: bg + disown

ctrl+zbgdisown -h

Si desea" en segundo plano & quot; las tareas que ya se están ejecutando, entonces Ctrl+Z luego corre bg para poner su tarea suspendida más reciente en segundo plano, lo que le permite continuar ejecutándose. disown mantendrá el proceso en ejecución después de cerrar la sesión. El -h la bandera evita el bloqueo.


screen y otros pueden hacerlo, pero para eso no están. Recomiendo nohup para tareas que sabes que vas a dejar atrás y bg para las tareas que ya está ejecutando y que no desea reiniciar.

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

Podrías hacer eso usando screen.

Tipo man screen para obtener más información o leer esto página de manual de pantalla.

Simple escenario:

  • ssh en su caja remota. Tipo screen A continuación, inicie el proceso que desee.

  • Pulsar Ctrl-A entonces 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 desea volver más tarde, inicie sesión de nuevo y escriba screen -r Esto "reanudará" su sesión de pantalla y podrá ver el resultado de su proceso.

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

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

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

Con disown puede cerrar la terminal y hacer que el proceso se ejecute en la máquina.

Estaba atrapado en un gran MV, así que no estaba en condiciones de detener el proceso, configurar la pantalla y luego volver a iniciarlo. Logré salir de la sesión SSH con el proceso en ejecución esencialmente haciendo los siguientes pasos:

  1. Establecer conexión SSH: ssh user@host
  2. Ejecute el comando deseado para iniciar el proceso
  3. Pulsar Ctrl+Z para pausar el proceso
  4. Ejecutar bg para poner el proceso en pausa en segundo plano y reanudarlo.
  5. Ejecutar disown [pid] (el ID de proceso es opcional, el valor predeterminado es el último proceso) para anular el proceso. Para obtener una lista de trabajos, simplemente escriba jobs antes.
  6. Salga de la sesión SSH ejecutando logout.

Uso de la disown comando:

disown [-ar] [-h] [jobspec ... | pid ... ]              Without  options,  remove  each jobspec from the table of active              jobs.  If jobspec is not present, and neither the -a nor the  -r              option  is  supplied, the current job is used.  If the -h option              is given, each jobspec is not removed from  the  table,  but  is              marked  so  that  SIGHUP  is  not  sent  to the job if the shell              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option              means  to  remove or mark all jobs; the -r option without a job‐              spec argument restricts operation to running jobs.   The  return              value is 0 unless a jobspec does not specify a valid job.

Hay dos programas principales que puede usar para mantener los programas y el estado del terminal a través de múltiples conexiones SSH. Son pantallas para el titular, pero desafortunadamente no se mantienen. Aparentemente desarrollándose activamente ahora) y tmux (más reciente, mantenido activamente). Byobu es un front-end que puede ejecutarse sobre cualquiera de estos sistemas y ofrecer información adicional sobre el estado de Ubuntu. En instalaciones nuevas, usará tmux como backend, si tiene una instalación anterior de byobu y una configuración existente, mantendrá el backend anterior, ya sea screen o tmux.

Byobu

Byobu se puede instalar en la computadora haciéndolo 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 byobu en otras distribuciones.

Uso de byobu

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

image-byobu

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

Uso:

Inicie byobu escribiendo byobu.

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

La mejor parte de byobu es que no tiene 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 en funcionamiento (separar), presione F6.

  • La próxima vez que vengas, solo hazlo byobu y volverás justo donde estabas.

    byobu-detach-attach

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

Puedes hacer mucho más usando Byobu. ¡Úsalo!Algunas guías definitivas son aqui, o aqui.

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

Puedes usar nohup pero la sabiduría moderna sugiere que use screen o byobu como su inicio de sesión para que pueda desconectarse y dejar las cosas en funcionamiento.

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

Hay una forma razonable de comenzar guía para la pantalla aqui.

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 screen en Ubuntu más nuevo. F2 para iniciar un nuevo terminal F3/F4 para alternar hacia adelante y hacia atrás y F6 para desconectar. Escriba exit para terminar los terminales de forma permanente.

Para un solo script de shell que tengo ejecutándose durante un largo período de tiempo, iniciaré sesión y ejecutaré el proceso en segundo plano usando '&'.

Ejemplo:

/path/to/my/script &

He cerrado sesión y desconectado mi sesión SSH. Cuando inicio sesión algún tiempo después, el script aún se está ejecutando, como lo demuestra la recopilación continua de datos del script.

Oye, aunque estuve 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 tener el proceso en ejecución y no necesita recuperar el control, y lo más importante es que no sabía que necesitará cerrar la sesión y que ya tiene el proceso en ejecución, no tiene suerte si usó bash como shell

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

Finalmente, invoque el comando disown (seguido del ID de trabajo ... igual que con el comando bg)

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

Deberías echarle un vistazo Pantalla GNU y a ver si te ayuda. Dependiendo de cómo necesite que la 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 abandonado.

Modo de empleo :

  • Utilice el comando screen para el primer inicio, desplácese por los mensajes de introducción, se le debe entregar un terminal.
  • C-a C-c abre otra terminal
  • C-a C-k mata una terminal
  • Puede usar C-a C-Space y C-a C-Backspace para recorrer los terminales
  • C-a C - a es útil si utiliza principalmente solo dos terminales
  • C-a C-d instala la sesión de pantalla actual y sale de las pantallas. A continuación, puede utilizar screen -r para reanudar la 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.

Relacionado con: https://unix.stackexchange.com/questions/4004/how-can-i-close-a-terminal-without-killing-the-command-running-in-it