Pregunta Mantener un proceso de Linux en ejecución después de que cierre la sesión


Me estoy conectando a una máquina Linux a través de SSH, y estoy tratando de ejecutar un script bash pesado que hace que las operaciones del sistema de archivos. Se espera que continúe funcionando durante horas, pero no puedo dejar abierta la sesión de SSH debido a los problemas de conexión a Internet que tengo.

Dudo que ejecutando el script con el operador de fondo, el símbolo comercial (&), hará el truco, porque lo probé y luego descubrí que el proceso no se completó. ¿Cómo puedo cerrar sesión y mantener el proceso en ejecución?


139
2017-09-15 06:00


origen




Respuestas:


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


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

Todos los procesos iniciados desde el terminal virtual continuarán ejecutándose con ese terminal virtual. Cuando vuelva a conectarse al servidor, puede volver a conectarse al terminal virtual y todo será como si nada hubiera pasado, excepto el tiempo transcurrido.

Dos multiplexores terminales populares son pantalla y tmux.

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


los HUP La señal (o SIGHUP) es enviada por el terminal a todos sus procesos secundarios cuando el terminal está cerrado. 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 fáciles de hacerlo son nohup y disown.

Para más información sobre cómo. nohup y disown Las obras leen esta pregunta y responden: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Nota: aunque los procesos se seguirán ejecutando, ya no podrá interactuar con ellos porque ya no están conectados a ningún terminal. Este método es principalmente útil para procesos por lotes de larga ejecución que, una vez iniciado, ya no necesitan ninguna entrada por parte del usuario.


132
2017-09-15 06:05



Me gusta esta respuesta, ya que proporciona una solución tanto para situaciones interactivas como no interactivas. En el caso interactivo, screen Te da muchas más opciones, pero si estás usando authorized_keys para permitir que las personas ejecuten un script de forma remota a través de ssh, la nohup Esta opción es una forma sencilla y agradable de que el script inicie procesos que duran más que el ssh Sesión utilizada para iniciarlos. - Mark Booth
@rahmanisback: recuerde que puede cambiar su respuesta aceptada en cualquier momento. El hecho de que hasta ahora la respuesta de EricA sea más votada no significa que sea la mejor respuesta para usted, de hecho, hacer que sea su respuesta aceptada podría alentar a más personas a votar como una buena respuesta. - Mark Booth
* tos * tmuxisbetter * tos * - crasic
tmux > pantalla. Pruébalo, nunca volverás. - h0tw1r3
@TheLQ - byobu es Pantalla de GNU. Todavía estás usando la pantalla, solo con un .screenrc altamente personalizado. - EEAA


Hay algunas maneras de hacer esto, pero la que me parece más útil es usar Pantalla GNU.

Después de que ssh en, ejecute screen. Esto iniciará otro shell ejecutándose dentro de la pantalla. Ejecute su comando, luego haga una Ctrl-una  re.

Esto te "desconectará" de la sesión de pantalla. En este punto, puede cerrar sesión o hacer cualquier otra cosa que desee.

Cuando desee volver a conectarse a la sesión de pantalla, simplemente ejecute screen -RD desde el indicador de comandos de la shell (como el mismo usuario de uso que creó la sesión).


92
2017-09-15 06:07



¡Increíble! Buena respuesta, gracias ... - rahmanisback
La pantalla tiene un montón de comandos, todos comenzando con Ctrl-a. Si solo aprendes uno extra, comienza con "Ctrl-a?". Entonces no vas a aprender "Ctrl-a c" y "Ctrl-a n" - olafure
@olafure +1, gracias. Parece que la pantalla va a ser de mi caja de herramientas principal. - rahmanisback
tmux > pantalla. Pruébalo, nunca volverás. - h0tw1r3
+1 para tmux. Renuncié a la pantalla hace 5 semanas. - Bryan Hunt


En bash, la disown palabra clave se adapta perfectamente a esto. Primero, ejecute el proceso en segundo plano (o use &o ^Z entonces escribe bg):

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

Escribiendo jobs Puedes ver que el proceso aún es propiedad del shell:

$ jobs
[1]+  Running  wget

Si tuviera que cerrar sesión en este punto, la tarea en segundo plano también se eliminaría. Sin embargo, si corres disown, bash separa el trabajo y le permite continuar ejecutándose:

$ disown

Puedes confirmar esto:

$ jobs
$ logout

Incluso puedes 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 se va nohup.out Archivos desparramados por todo tu sistema de archivos. También, nohup debe ejecutarse antes de ejecutar el comando - disown se puede usar si solo decide más adelante que desea establecer un fondo y separar la tarea.


70
2017-09-15 12:27



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 otra shell. Pero me atendré a tu enfoque siempre que esté usando bash. - rahmanisback
Sí, esto es específico de bash, ya que bash es el único shell que he usado. Me pregunto si otros shells son compatibles con algo similar (es decir, el lanzamiento en segundo plano sin ningún tipo de copia). Sería fantástico si alguien pudiera publicar otras respuestas para otros shells. - Jeremy Visser
ver mi respuesta que muestra cómo hacerlo con cualquier sh-lookalike - w00t
+1 por poder decidir más tarde. Justo en este momento tuve una necesidad de esto. trabajó como se anuncia - code_monk


La herramienta nohup, disponible en la mayoría de las cajas de Linux, hará esto.


37
2017-09-15 06:14



Esta es, con mucho, la respuesta más simple. Cualquier salida de se dirige automáticamente a nohup.out y se puede examinar más adelante. - Julian
nohup no requiere zsh en absoluto. - Aaron Brown
Nohup es la respuesta correcta, es la abreviatura para no colgar. - Kinjal Dixit
Nohup se encuentra en muchas más máquinas que en la pantalla, por lo que debe saber cómo usarlo. - Zenon


Solo para ser concienzudo, les señalo tmux, que tiene la misma idea básica que la pantalla:

Tmux pretende ser una alternativa moderna, con licencia BSD para programas como la pantalla GNU. Las características principales incluyen:

  • Una interfaz de comandos potente, coherente, bien documentada y fácilmente programable.
  • Una ventana se puede dividir horizontal y verticalmente en paneles.
  • Los paneles se pueden mover y cambiar de tamaño libremente, o se pueden organizar en diseños preestablecidos.
  • Soporte para terminales UTF-8 y 256 colores.
  • Copiar y pegar con múltiples buffers.
  • Menús interactivos para seleccionar ventanas, sesiones o clientes.
  • Cambie la ventana actual buscando texto en el objetivo.
  • Bloqueo de terminales, manualmente o después de un timeout.
  • Un código base limpio, fácil de extender y con licencia BSD, en desarrollo activo.

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


27
2017-09-15 06:23



Utilizando "gnu screen" como su consulta de búsqueda funciona bastante bien. - gnur
+1000 para tmux! - mbq


La pantalla es excesiva para mantener los procesos en ejecución cuando se cierra la sesión.

Tratar dtach:

dtach es un programa escrito en C que emula la característica de separación de   pantalla, que permite ejecutar un programa en un entorno que   Está protegido del terminal controlador. Por ejemplo, el programa.   bajo el control de dtach no se vería afectado por el terminal que está   desconectado por alguna razón.

dtach fue escrito porque la pantalla no satisfacía adecuadamente mis necesidades; yo   no necesitaba características adicionales de la pantalla, como soporte para múltiples   Terminales o soporte de emulación de terminal. la pantalla también era demasiado grande,   Abultado, y tenía un código fuente que era difícil de entender.

La pantalla también interfirió con mi uso de aplicaciones de pantalla completa como   emacs e ircII, debido a su excesiva interpretación de la corriente   Entre el programa y los terminales adjuntos. dtach no tiene un   capa de emulación de terminal, y pasa el flujo de salida en bruto de la   Programa a los terminales adjuntos. El único procesamiento de entrada que   dtach sí realiza es buscar el carácter de separación (que señala   dtach para separar del programa) y procesar la tecla de suspensión   (que le dice a dtach que se suspenda temporalmente sin afectar la   programa en ejecución), y ambos pueden ser deshabilitados si así lo desea.

Contrariamente a la pantalla, dtach tiene características mínimas y es extremadamente pequeño.   Esto permite que dtach sea auditado más fácilmente para detectar errores y seguridad   agujeros, y lo hace accesible en entornos donde el espacio es limitado,   como en los discos de rescate.


11
2017-09-15 15:06



Gracias. Vine aquí solo para publicar sobre dtach también. Es mi cosa de ir para el desprendimiento terminal ahora; La pantalla hace MUCHO demasiado, e interfiere con la entrada en un grado ridículo. La pantalla de hecho necesita su propio termómetro es bastante inquietante. - fluffy


Aquí hay una manera de demonizar cualquier proceso de shell, sin necesidad de programas externos:

( while sleep 5; do date; done ) <&- >output.txt &

Cuando luego cierra la sesión, el trabajo continuará ejecutándose como lo demuestra el archivo output.txt (que tiene un búfer, por lo que demora un poco en mostrarse). No te olvides de matar tu trabajo después de las pruebas.

Así que todo lo que necesita hacer es cerrar la entrada estándar y el trabajo de fondo. Para ser realmente bueno, primero cd / así que no te aferras a una montura.

Esto funciona incluso en sh simple bajo Solaris.


9
2017-09-16 16:48



Interesante. Surgieron algunas preguntas notables. Puedo ver que pones el STDIN en nada, el - ¿operador? Cuál es la diferencia entre < /dev/null y &- ? Supongo que a STDIN (y a otros STDOUT y STDERR) se les puede asignar un archivo por < file, o una corriente por <& stream En caso de STDIN. ¿Sería lo mismo usar < /dev/null en su ejemplo anterior? Y el operador - arriba se refiere a un nulo como la corriente? - rahmanisback
Cuando haces x <& -, eso cierra el descriptor del archivo x. En este caso, no hay x, lo que hace que el valor predeterminado de bash sea 1, es decir, la entrada estándar. Si usa </ dev / null, no está cerrando stdin, solo le está dando un archivo vacío al programa como entrada. - w00t
Y para ser honesto, no sé realmente por qué esto daemoniza lo que está ejecutando :-) Sin embargo, funciona, lo usamos en producción. Lo descubrí mientras jugueteaba con la esperanza de poder demonizar un proceso en shell sin necesidad de nada especial, así que comencé cerrando stdin y eso fue suficiente. Debería leer algunas fuentes de shell, pero supongo que si cierra la entrada estándar y el proceso en segundo plano, también separa el proceso. - w00t
Creo que la razón es que se desencadena un SIGHUP (la señal real que causa que el niño abandone el sistema cuando muere la cáscara) cuando un proceso padre cierra el control estándar de su hijo. Sin embargo, si stdin que empieza como nulo, en lugar de estar cerrado después del hecho, no hay forma de que el padre active el SIGHUP. Buen hallazgo, sin embargo, nunca habría pensado en eso. - Jeremy Visser
@JeremyVisser eso suena realmente plausible! - w00t


los at El comando puede ser útil para este tipo de situación. Por ejemplo, escriba:

at now

Y luego puede ingresar un comando o una serie de comandos que se ejecutarán. Los resultados deben ser enviados por correo electrónico a usted, si el correo electrónico está configurado correctamente en la máquina.

En lugar de now, puede especificar una hora opcionalmente con una fecha o una expresión de hora como now + 15 minutes. Ver man at para más detalles.


7
2017-09-16 08:23





byobu en Ubuntu es una buena interfaz para la pantalla. Presionando Ctrl-? Obtienes una lista de todos los atajos de teclado. Agrega una barra de estado que puede ser útil para observar la carga de la CPU, el espacio en disco, etc. En general, proporciona una experiencia que describiría como una conexión VNC basada en terminal.

nohup permite iniciar un trabajo en segundo plano con su salida enrutada a un archivo de registro, que siempre puede redirigirse a / dev / null si no es necesario.


7
2017-09-15 13:26