765 votos

¿Cómo mantener los procesos en ejecución después de terminar la sesión de 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 ejecutándose en la máquina remota?

2 votos

897voto

tongpu Puntos 2309

Debería buscar alternativas modernas como tmux .

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

  • Las ventanas pueden moverse entre sesiones e incluso vincularse a varias sesiones
  • Las ventanas pueden dividirse horizontal y verticalmente en paneles
  • Soporte para UTF-8 y terminales de 256 colores
  • Las sesiones se pueden controlar desde el Shell sin necesidad de entrar en una sesión

Funcionalidad básica

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

  • ssh en la máquina remota
  • iniciar tmux tecleando tmux en el Shell
  • inicie el proceso que desee dentro del iniciado tmux sesión
  • dejar/despegar el tmux sesión escribiendo Ctrl + b y luego d

Ahora puede cerrar la sesión de la máquina remota de forma segura, su proceso seguirá funcionando dentro de tmux . Cuando vuelvas a entrar y quieras comprobar el estado de tu proceso puedes utilizar tmux attach para adjuntar a su tmux sesión.

Si desea tener varias sesiones que se ejecuten una al lado de la otra, debe nombrar cada sesión utilizando Ctrl + b y $ . Puede obtener una lista de las sesiones en curso utilizando tmux list-sessions o simplemente tmux ls Ahora adjunta una sesión en curso 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 más información, eche un vistazo a man tmux o la página GitHub de tmux . En particular, aquí hay un FAQ sobre las principales diferencias entre screen y tmux .

1 votos

Tmux es realmente el camino a seguir hoy en día. GNU Screen está bien, pero Tmux te da mucha más funcionalidad, como adjuntar desde múltiples lugares sin tener que separar. Es impresionante.

4 votos

@CraigM Use screen -x -r [screenname] o screen -rx para abreviar si sólo tiene una sesión de pantalla activa. Esto le permite adjuntar una instancia de pantalla existente.

8 votos

Este consejo me ayudó con el mismo problema pero creo que incluye una errata. Estoy bastante seguro de que usted necesita para escribir Ctrl-b y luego d para dejar/despegar el tmux sesión. Ciertamente, este es el caso de la versión de tmux en mi Ubuntu 12.04.

390voto

coteyr Puntos 6419

Opción 1: nohup

La mejor manera suele ser la más sencilla.

nohup long-running-command &

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

man nohup

Opción 2: bg + disown

ctrl+z
bg
disown -h

Si quiere poner en "segundo plano" las tareas que ya se están ejecutando, entonces Ctrl + Z y luego ejecuta bg para poner la tarea suspendida más reciente en segundo plano, permitiendo que siga funcionando. disown mantendrá el proceso en marcha después de cerrar la sesión. La página web -h evita que se cuelgue.


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

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

7 votos

Yo recomendaría hacer disown -h

0 votos

Curiosamente screen y tmux no funcionan para miner, bur nohup funciona

2 votos

bg + disown no me ha funcionado. Tenía un despliegue script en ejecución que olvidé iniciar dentro de tmux, y necesitaba salir temprano para una reunión. El script emite continuamente el progreso al script. ctrl+z detuvo el proceso, devolviéndome a bash. bg reanudó el proceso, pero también reanudó la salida del estado a bash, haciendo imposible ver lo que estaba escribiendo. Sin embargo, un disown el comando produjo "disown: current: no such job"

230voto

Savvas Dalkitsis Puntos 206

Para ello, puede utilizar screen .

Tipo man screen para saber más o leer esto página de manual de la pantalla .

Un escenario sencillo:

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

  • Pulse Ctrl - A entonces Ctrl - D . Esto "separará" su sesión de pantalla pero dejará sus procesos en ejecución. Ahora puede cerrar la sesión de la caja remota.

  • Si quieres volver más tarde, conéctate de nuevo y escribe screen -r Esto "reanudará" su sesión de pantalla, y podrá ver la salida de su proceso.

37 votos

Suelo nombrar mis sesiones de pantalla utilizando screen -S name para facilitar la conexión con el correcto más adelante.

0 votos

El enlace no funciona

2 votos

Personalmente, estoy trabajando en una caja sin ningún software de control de paquetes. Después de pasar media hora construyendo dependencias para TMUX (con el que personalmente tengo experiencia y me gusta) desde el código fuente, quedó claro que la pantalla era la solución mejor y más sencilla para mí. TL;DR: la solución óptima para este problema depende del caso de uso, de la máquina y del tiempo que tengas para configurarlo. Gracias por esta respuesta :)

91voto

lambacck Puntos 346

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

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

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

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

13 votos

Esta es también mi forma favorita de hacerlo. Con frecuencia utilizo disown -a && exit

1 votos

Perfecto. ¡Este es un comando encantador y merece todos los upvotes!

8 votos

Una palabra de precaución, detuve un proceso en ejecución con Ctrl-Z y no lo inicié en segundo plano antes de llamar a disown y lo mató.

18voto

Brett Veenstra Puntos 715

No se puede hacer esto una vez que el proceso ha comenzado, es necesario haber configurado las cosas antes de ejecutar un trabajo de larga duración.

Puede utilizar nohup pero la sabiduría moderna sugiere que utilices screen o byobu como inicio de sesión para que puedas separarte y dejar las cosas funcionando.

La pantalla tiene la ventaja de que se puede separar de una máquina y volver a conectarla desde otra, lo que resulta práctico si se quiere comprobar los procesos que se ejecutan durante mucho tiempo, más allá del final de la jornada laboral.

Hay un comienzo razonable guía de la pantalla 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 el nuevo ubuntu. F2 para iniciar una nueva terminal F3/F4 para alternar entre una y otra y F6 para desconectar. Teclea exit para terminar la terminal permanentemente.

1 votos

Byobu utiliza tmux estos días..

14 votos

"No puedes hacer esto una vez que el proceso ha comenzado, necesitas haber configurado las cosas antes de ejecutar un trabajo de larga duración". -- no, puedes usar disown para conseguirlo. Ver la respuesta de @bassgey

1 votos

Después de luchar para aprender pantalla y tmux....byobu trajo lágrimas a mis ojos

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X