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


Respuestas:


750

Debes buscar alternativas modernas como tmux.

tmuxes superior a screenpor muchas razones, aquí hay algunos ejemplos:

  • Windows puede moverse entre sesiones e incluso vincularse a varias sesiones
  • Windows se puede dividir horizontal y verticalmente en paneles
  • Soporte para 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 que se explica en la respuesta recomendada screen, deberá hacer lo siguiente:

  • ssh en la máquina remota
  • comenzar tmuxescribiendo tmuxen el shell
  • inicie el proceso que desee dentro de la tmuxsesión iniciada
  • salir / separar la tmuxsesión escribiendo Ctrl+ by luegod

Ahora puede cerrar sesión de forma segura desde la máquina remota, su proceso seguirá ejecutándose dentro tmux. Cuando regrese de nuevo y desee verificar el estado de su proceso, puede usarlo tmux attachpara adjuntarlo a su tmuxsesión.

Si desea que se ejecuten varias sesiones en paralelo, debe nombrar cada sesión con Ctrl+ by $. Puede obtener una lista de las sesiones que se ejecutan actualmente utilizando tmux list-sessions, ahora adjunte a una sesión en ejecución con el comando tmux attach-session -t 0.

tmuxpuede hacer cosas mucho más avanzadas que manejar una sola ventana en una sola sesión. Para obtener más información echar un vistazo en el man tmuxo la página tmux GitHub . En particular, aquí hay una pregunta frecuente sobre las principales diferencias entre screeny tmux.


44
@CraigM Use screen -x -r [screenname]o screen -rxpara abreviar si solo tiene una sesión de pantalla activa. Esto le permite adjuntar una instancia de pantalla existente.
Lekensteyn el

55
Este consejo me ayudó con el mismo problema, pero creo que incluye un error tipográfico. Estoy bastante seguro de que necesita escribir Ctrl-by luego dpara salir / separar la tmuxsesión. Ciertamente, ese es el caso de la versión de tmuxen mi Ubuntu 12.04.
cxrodgers

17
Cometí un error al seguir las instrucciones anteriores. Lo compartiré si alguien puede caer en el mismo error: comencé tmux en el shell de mi propia computadora en lugar del shell de la computadora remota. Uno necesita iniciar tmux en el shell de la computadora remota.
Mert Nuhoglu

55
La pantalla ahora se está desarrollando nuevamente: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html ¿Podría actualizar su respuesta?
muru

44
Alternativamente, ejecute en tmux detachlugar de escribirctrl-b d
Andrew

306

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 registros estándar nohup.log.

man nohup

Opcion 2: bg

Si desea "en segundo plano" algunas tareas que ya se están ejecutando, su mejor opción es Ctrl+ y Zluego ejecutar

bg

para poner en segundo plano la tarea suspendida más reciente y permitirle seguir ejecutándose.

Luego, un rápido disowndebería mantener el proceso en ejecución después de cerrar sesión.

screeny otros pueden hacerlo, pero para eso no están. Recomiendo nohuppara tareas que sabe que va a dejar atrás y bgpara tareas que ya está ejecutando y no desea reiniciar.

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


44
Recomendaría hacerdisown -h
Michele

Curiosamente, screen y tmux no funcionan para mineros, pero no funciona
Yasin Okumuş

1
bg+ disownno funcionó para mí. Tenía un script de implementación ejecutándose. Olvidé comenzar dentro de tmux y necesitaba irme temprano para una reunión. El script genera continuamente progreso en el shell. ctrl+zdetuve el proceso y me devolvió a bash. bgreanudó el proceso, pero también reanudó la salida del estado a bash, por lo que es imposible ver lo que estaba escribiendo. Sin embargo, un disowncomando produjo "disown: current: no such job"
BrianHVB

esto no funcionó para mí julia myFile.jlpor cualquier razón. tmux lo hace y es genial.
kilgoretrout

Esto funcionó para mí, muchas gracias
Chad

207

Podrías hacer eso usando screen.

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

Escenario simple:

  • ssh en su caja remota. Escriba screenLuego comience el proceso que desee.

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

  • Si desea volver más tarde, inicie sesión nuevamente y escriba screen -rEsto "reanudará" su sesión de pantalla, y podrá ver el resultado de su proceso.


32
Por lo general, nombraré mis sesiones de pantalla screen -S namepara que sea más fácil conectarme a la correcta más tarde.
David Oneill

El enlace está inactivo
Gab 是 好人

1
Personalmente, estoy trabajando en una caja sin ningún software de control de paquetes. Después de pasar aproximadamente media hora construyendo dependencias para TMUX (con las que personalmente tengo experiencia y me gusta) desde el origen, quedó claro que la pantalla era la solución mejor y más simple para mí. TL; DR: la solución óptima para este problema depende del caso de uso, la máquina y cuánto tiempo tiene que configurar. Gracias por esta respuesta :)
Max von Hippel

¡La combinación con screen -Santes de salir y screen -ral regresar es increíble!
Meloman

Gracias por esto. Esta solución funcionó para mí mientras que tmux no (utilizo una versión de bash para Windows mientras estoy en una máquina Linux)
Michael Sorensen

83

Screen and 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 especificación de trabajo de la tabla de trabajos activos. Si -hse da la opción, 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 proporciona -ani la -ropción, se utiliza el trabajo actual. Si no se proporciona una especificación de trabajo , la -aopción significa eliminar o marcar todos los trabajos; la -ropción sin un argumento jobspec restringe la operación a trabajos en ejecución.

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


10
Esta es también mi forma favorita de hacerlo. Yo uso con frecuenciadisown -a && exit
Stefano Palazzo

1
Perfecto. ¡Este es un comando encantador y merece todos los votos positivos!
Greg

8
una palabra de precaución, detuve un proceso en ejecución con Ctrl-Z y no lo inicié en segundo plano antes de llamar disowny lo mató.
HDave

3
Puede bloquearse si quiere escribir en la terminal. Redirigir la salida de un proceso en ejecución no es tan fácil. Es mejor comenzarlo correctamente con nohup.
jiggunjer

2
Esta es una buena respuesta, porque responde directamente a la pregunta. El autor de la pregunta preguntó qué hacer después de haber ejecutado un montón de comandos de larga ejecución. La mayoría de estas respuestas le permiten saber qué hacer antes de ejecutar los comandos.
q0rban

53

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 ejecutándose esencialmente haciendo los siguientes pasos:

  1. ssh [servidor]
  2. mando
  3. Ctrl+Z
  4. bg
  5. disown [proceso pid opcional, predeterminado para durar]
  6. salida

El paso 3 pausa el proceso actual (por ejemplo, mi comando 'mv').
El paso 4 pone el proceso en pausa en segundo plano y lo reanuda.
El paso 5 te permite rechazar el proceso. ** Para obtener una lista de trabajos simplemente escriba jobsantes.


** Con respecto a disown (del manual bash):

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.

2
Los incorporados son siempre mi primera opción :) THX
ken_oy

Esta respuesta debe marcarse como correcta. Instalar y acostumbrarse a la pantalla para resolver este problema es exagerado.
Ulrich-Lorenz Schlüter

Esto es muy útil cuando ya ha iniciado cualquier comando y se está ejecutando durante mucho tiempo. Terminar e iniciarlo en una sesión TMUX llevará tiempo
Deepali Mittal

1
@ tom-brossman: ¡Cuidado con ediciones innecesarias como esta ! Si se invoca sin especificación de trabajo, el disowncomando incorporado actúa en el trabajo en segundo plano más reciente.
David Foerster

22

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 de pantalla (el titular, pero desafortunadamente no se mantiene . Aparentemente se está desarrollando activamente ahora ) y tmux (más nuevo, mantenido activamente). Byobu es un front end que puede ejecutarse sobre estos sistemas y ofrecer información adicional sobre el estado de ubuntu. En las nuevas instalaciones, 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 al hacerlo en una máquina basada en Debian:

sudo aptitude install byobu

Usando mmm, lo haces

su -c 'yum install byobu'

También es posible instalar byobu en otras distribuciones.

Usando byobu

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

image-byobu

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

Uso:

Comience byobu escribiendo byobu.

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

La mejor parte de byobu es que no tienes que matar los procesos que se ejecutan en el terminal para abandonar el terminal. Simplemente puede enviar screen / tmux (el esqueleto de byobu) al fondo y reanudar la próxima vez que venga:

  • Para dejar byobu y mantenerlo en funcionamiento (separar) presione F6.
  • La próxima vez que vengas, solo hazlo byobuy deberías regresar a donde estabas.

    byobu-detach-attach

También puede crear varias sesiones de byobu por byobu -S session1y así sucesivamente. Y puede conectarse a cualquiera de ellos cuando regrese.

Puedes hacer mucho más con Byobu. Úsalo! Algunas guías definitivas están aquí o aquí .


Intenté usar byobu desde una sesión basada en PuTTY en mi cuadro de Ubuntu, pero la línea de estado se repite y aparece en la pantalla. Aunque se separó correctamente al presionar F6, no era una solución utilizable en mi configuración.
jfmessier

1
@jfmessier Es porque PuTTY no toma ncurses (utf-8 básicamente) bien. Es posible eliminar este problema siguiendo este hilo - stackoverflow.com/questions/10731099/…
SiddharthaRT

¡Esto es asombroso! 1. me da un mensaje bash de color que parece que no puedo habilitar con bash como mi shell predeterminado y 2. ¡Puedo ejecutar 2 bots al mismo tiempo y todavía tengo otro terminal para trabajar! @SiddharthaRT te mereces un voto positivo señor!
Dev

18

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

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

La pantalla tiene la ventaja de que puede desconectarse de una máquina y volver a conectarla 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 guía de inicio razonable para 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 ubuntu más reciente. F2 para iniciar un nuevo terminal F3 / F4 para alternar y F6 para desconectar. Escriba exit para realmente terminar terminales permanentemente.


byobu usa tmux en estos días ..
scottl

12
"No puede hacer esto una vez que el proceso ha comenzado, debe haber configurado las cosas antes de ejecutar un trabajo de larga duración". - No, puedes usar disownpara lograr esto. Ver la respuesta de @ bassgey
Rich

1
después de luchar para aprender pantalla y tmux ... byobu me hizo llorar
HDave

disowny si es necesario Ctrl-z, bgpara obtenerlo del terminal activo y en segundo plano. A continuación, disown.
mimoralea

8

Hola, si bien acepté 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 es necesario recuperar el control, y lo más importante es que no estaba al tanto de que necesitará cerrar la sesión y ya tiene el proceso en ejecución, no tiene suerte si usaste bash como el caparazón

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 usando los trabajos de comando)

Finalmente invoque el comando renegado (seguido del jobid ... 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.


2
¡Esta respuesta es la mejor! ¿Por qué están hablando todos? screenLa pregunta se planteó después del inicio de sesión, cómo mantener los procesos en ejecución, ahora después de iniciar sesión pero antes de iniciarlos. Gran respuesta Jorge, ¡realmente me has ayudado! :)
jwbensley

1
Simplemente bg(sin %1) suele ser suficiente, ya que el trabajo predeterminado es el trabajo actual
Walter Tross

Sería bueno tener una respuesta integral: A priori (configuración anticipada): pantalla de terminal ascii (antigua), tmux (neewer); X windows: vnc (antiguo, aún mantenido), xpra (más nuevo), con xpra sin root. Un posterior (que persiste después de que comenzaste): ^ Z, renegado, ... Pero soy demasiado vago para desarrollarlo más que esto.
Krazy Glew

8

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

Ejemplo:

/path/to/my/script &

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


3
Sí, me gustaría saber cómo screen / tmux es mejor que esta solución simple.
Mads Skjern

Sí, también puedo ver esto en mi ubuntu, pero no debería suceder en teoría. No entiendo por qué
Daniel Pinyol

1
@MadsSkjern Porque no puede ingresar ninguna entrada en el script utilizando este método.
Ken Sharp

1
@MadsSkjern, la razón es que si ejecuta procesos como este &si cierra la sesión y accede a su sesión SSH, el proceso seguirá ejecutándose, sin embargo, no podrá ver la salida de ese proceso (si su script hizo eco de algo no lo verá, pero si escribe un archivo, el archivo estará allí)
DarkCygnus

4

Deberías revisar la pantalla GNU y ver si te 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 abandonara.

Cómo utilizar :

  • Use el comando screenpara el primer inicio, desplácese por los mensajes de introducción, debería recibir un terminal.
  • Ca Cc abre otra terminal
  • Ca Ck mata una terminal
  • Puede usar Ca C-Space y Ca C-Backspace para recorrer las terminales.
  • Ca Ca es útil si usas principalmente dos terminales
  • Ca Cd desconecta la sesión de pantalla actual y sale de las pantallas. Luego puede usar screen -rpara 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.


3

La respuesta más simple ...

Ctrl + Z suspenderá el programa en ejecución

"bg" lo ejecutará en segundo plano


55
Sin rechazar el proceso (con algo como disowno nohup), esto generalmente no mantendrá el proceso en ejecución después del final de la sesión SSH.
Eliah Kagan

3
En mi servidor Ubuntu, con la configuración predeterminada, ¡realmente sigue funcionando!
Mads Skjern

3

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

disown -a

0

Si bien todos dicen usar disown(la única opción que tiene después de que ya comenzó el proceso), nohupo incluso ejecutar el comando screen, lo cual es útil si desea ver toda la salida del comando ... Soy fanático de screen.. Todavía he intentado las distribuciones mainstream más recientes de Linux y simplemente poner el trabajo en segundo plano y dejar de fumar no hace que todos los procesos que se están ejecutando mueran. Debe haber un entorno global o algo así. Estoy intentando esto en algunos sistemas bastante antiguos (slackware 12) y mi script de prueba sigue ejecutándose hasta que lo elimino 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 que screensería la mejor manera de manejar esto, aunque mi guión escribió a archivos o lo que sea .. nunca he necesitado utilizar ingrese disown -a o nohupmenos que estaba fuera de la paranoia completa. ¿Quizás alguien pueda arrojar algo de luz sobre cómo se comporta bash por defecto? ¿Quizás algunos administradores del sistema cambien los valores predeterminados en los shells grandes para evitar que los procesos de sus usuarios sobrecarguen el sistema?


Si tiene alguna otra consulta, hágala como una nueva pregunta
heemayl

0

Desafortunadamente, una sesión SSH terminada puede provocar que tmux o la pantalla se apaguen. Esto se debe a systemdque finalizará cualquier proceso secundario al cerrar sesión en una sesión.

Puede cambiar esta configuración en su logind.conf( /etc/systemd/logind.conf):

KillUserProcesses=no

Gracias por responder en https://unix.stackexchange.com/questions/490267 .


-1

En vez de :

cmd options; 

Añadir antes nohup:

nohup cmd options & 

Luego, podrá ver la consola estándar mediante:

tail -f nohup.out
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.