145 votos

Mantener un proceso de linux en funcionamiento después de cerrar la sesión

Me estoy conectando a una máquina Linux a través de SSH, y estoy tratando de ejecutar un pesado bash script que hace operaciones de sistema de archivos. Se espera que siga ejecutándose durante horas, pero no puedo dejar la sesión SSH abierta por problemas de conexión a internet que tengo.

Dudo que al ejecutar el script con el operador de fondo, el ampersand ( & ), hará el truco, porque yo lo probé y más tarde encontré que el proceso no se completó. ¿Cómo puedo cerrar la sesión y mantener el proceso en marcha?

136voto

lesmana Puntos 1852

El mejor método es iniciar el proceso en un multiplexor terminal. Como alternativa, puede hacer que el proceso no reciba la señal HUP.


A multiplexor de terminales proporciona terminales "virtuales" que se ejecutan independientemente de la terminal "real" (en realidad todas las terminales de hoy en día son "virtuales", pero ese es otro tema para otro día). La terminal virtual seguirá funcionando incluso si su terminal real se cierra con su sesión ssh.

Todos los procesos iniciados desde la terminal virtual seguirán funcionando con esa terminal virtual. Cuando te conectes de nuevo al servidor puedes volver a conectarte a la terminal virtual y todo será como si no hubiera pasado nada, aparte del tiempo que ha pasado.

Dos populares multiplexores de terminales son pantalla y tmux .

La pantalla tiene una empinada curva de aprendizaje. Aquí hay un buen tutorial con diagramas que explican el concepto: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


El HUP (o SIGHUP) es enviada por la terminal a todos sus procesos hijos cuando la terminal se cierra. La acción común al recibir SIGHUP es terminar. Por lo tanto, cuando su sesión ssh se desconecte, todos sus procesos terminarán. Para evitar esto puedes hacer que tus procesos no reciban SIGHUP.

Dos métodos sencillos para hacerlo son nohup y disown .

Para más información sobre cómo nohup y disown trabaja lee esta pregunta y la respuesta: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Nota: aunque los procesos seguirán ejecutándose, ya no podrás interactuar con ellos porque ya no están conectados a ningún terminal. Este método es útil sobre todo para los procesos por lotes que se ejecutan durante mucho tiempo y que, una vez iniciados, ya no necesitan ninguna entrada del usuario.

3 votos

Me gusta esta respuesta, ya que proporciona una solución tanto para las situaciones interactivas como para las no interactivas. En el caso interactivo, screen te da muchas más opciones, pero si estás usando authorized_keys para permitir que la gente ejecute un script de forma remota a través de ssh El nohup es una forma sencilla de que el script inicie procesos que duren más que el ssh sesión utilizada para iniciarlas.

0 votos

lesmana, y @Mark Booth me gustan sus respuestas ya que dice más consejos útiles.. 1+

1 votos

@rahmanisback - Recuerda que puedes cambiar la respuesta aceptada en cualquier momento. El hecho de que hasta ahora la respuesta de EricA sea la más votada no significa que sea la mejor respuesta para ti, de hecho hacerla tu respuesta aceptada puede animar a más gente a votarla como una buena respuesta.

94voto

EEAA Puntos 66011

Hay varias formas de hacerlo, pero la que me parece más útil es utilizar Pantalla GNU .

Después de conectarse, ejecute screen . Esto iniciará otro Shell que se ejecuta dentro de la pantalla. Ejecute su comando, luego haga un Ctrl - a d .

Esto le "desconectará" de la sesión de pantalla. En este momento, puedes cerrar la sesión o hacer cualquier otra cosa que desees.

Cuando quiera volver a conectarse a la sesión de pantalla, sólo tiene que ejecutar screen -RD desde el prompt Shell (como el mismo usuario que creó la sesión).

6 votos

La pantalla tiene un montón de comandos, todos comienzan con Ctrl-a. Si sólo aprendes uno extra, empieza con "Ctrl-a ?". Luego querrás aprender "Ctrl-a c" y "Ctrl-a n".

1 votos

@olafure +1, gracias. Parece que Screen va a ser de mi caja de herramientas principal.

0 votos

tmux > pantalla. Pruébalo, nunca volverás atrás.

76voto

erichui Puntos 1488

En bash El disown palabra clave se adapta perfectamente a esto. En primer lugar, ejecute su proceso en segundo plano (utilice & o ^Z entonces escriba bg ):

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

Al teclear jobs puedes ver que el proceso sigue siendo propiedad del Shell:

$ jobs
[1]+  Running  wget

Si se cerrara la sesión en este punto, la tarea en segundo plano también moriría. Sin embargo, si ejecuta disown bash separa el trabajo y permite que siga funcionando:

$ disown

Puedes confirmarlo:

$ jobs
$ logout

Incluso puede combinar el & y disown en la misma línea, como:

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

Esto es mejor que correr nohup en mi opinión porque no deja nohup.out archivos desparramados por todo su sistema de archivos. También, nohup debe ejecutarse antes de ejecutar el comando - disown se puede utilizar si sólo se decide más tarde que se quiere pasar a un segundo plano y separar la tarea.

1 votos

Esa es una muy buena respuesta, 1+. La única preferencia por nohup o Screen sería la independencia de bash, y podría usarse con otros Shell. Pero me quedaré con tu enfoque siempre que use bash.

0 votos

Sí - esto es específico de bash, ya que bash es el único Shell que he utilizado. Me pregunto si otros shells soportan algo similar (es decir, el lanzamiento en segundo plano sin nohup) - sería fantástico si alguien pudiera publicar otras respuestas para otros shells.

1 votos

ver mi respuesta mostrando como hacerlo con cualquier sh-lookalike

37voto

Korjavin Ivan Puntos 1063

La herramienta nohup, disponible en la mayoría de los equipos Linux, lo hará.

1 votos

Esta es, con mucho, la respuesta más sencilla. Cualquier salida de es dirigida automáticamente a nohup.out y puede ser examinada más tarde.

3 votos

nohup no requiere zsh en absoluto.

0 votos

nohup es la respuesta correcta, es la abreviatura de no hangup.

27voto

Handyman5 Puntos 3517

Sólo para ser minucioso, señalaré tmux que tiene la misma idea básica que la pantalla:

tmux pretende ser una alternativa moderna, con licencia BSD, a programas como GNU screen. Las principales características son:

  • Una interfaz de comandos potente, coherente, bien documentada y fácil de programar.
  • Una ventana puede estar dividida horizontal y verticalmente en paneles.
  • Los paneles se pueden mover y redimensionar libremente, o se pueden organizar en diseños preestablecidos.
  • Soporte para UTF-8 y terminales de 256 colores.
  • Copiar y pegar con varios buffers.
  • Menús interactivos para seleccionar Windows, sesiones o clientes.
  • Cambia la ventana actual buscando el texto en el objetivo.
  • Bloqueo del terminal, manualmente o después de un tiempo de espera.
  • Una base de código limpia, fácilmente ampliable y con licencia BSD, en desarrollo activo.

Sin embargo, es aproximadamente infinitamente más fácil de buscar en Google.

2 votos

Utilizando "gnu screen" como su consulta de búsqueda funciona bastante bien.

4 votos

¡+1000 para tmux!

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: