134 votos

Mantener un sistema linux en el proceso que se ejecuta después de que me logout

Me estoy conectando a una máquina Linux a través de SSH, y estoy tratando de ejecutar un pesado script en bash que hace que el sistema de ficheros de operaciones. Se espera para seguir funcionando durante horas, pero no puedo salir de la sesión de SSH abierto debido a problemas de conexión a internet que tengo.

Dudo que la ejecución de la secuencia de comandos con el fondo del operador, el signo de y comercial (&), hará el truco, porque lo he probado y más tarde se encontró que el proceso no se completó. ¿Cómo puedo cerrar la sesión y mantener el proceso en funcionamiento?

129voto

lesmana Puntos 1852

El mejor método es utilizar la pantalla. Otro método es utilizar nohup.


La pantalla es un "virtual" terminal que puede ejecutarse desde una "real" de la terminal (en realidad todos los terminales de hoy en día son "virtuales", pero eso es otro tema para otro día). La pantalla sigue funcionando incluso si su sesión de ssh se desconecta. Cualquier proceso que se inicia en una sesión de pantalla sigue funcionando con la pantalla de la sesión. Cuando se vuelva a conectar al servidor puede volver a conectarse a la sesión de pantalla y todo volverá a ser como si no pasó nada, excepto el tiempo que pasa.

La pantalla tiene una curva de aprendizaje empinada. "Hablar de UNIX: Stayin' alive con Pantalla", es un bonito tutorial con los diagramas de explicar el concepto.

Una alternativa a la pantalla de es tmux.


nohup ignora la HUP de la señal. El HUP de la señal se envía a todos los procesos hijo cuando el terminal de control está cerrado (por ejemplo, por una desconectado sesión de ssh). Los procesos iniciados con nohup de no recibir la HUP de la señal. Aunque los procesos que sigue funcionando, ya no puede interactuar con ellos, porque ellos ya no están conectados a ningún terminal.

nohup es principalmente útil de larga ejecución de procesos batch que, una vez iniciado, ya no necesitan más atención.

Como una alternativa a nohup, el Bash de comandos integrados disown puede ser usado para decirle a bash para no enviar el programa de la HUP de la señal.

92voto

EEAA Puntos 66011

Hay un par de maneras de hacer esto, pero la que me parece más útil es el uso de GNU Pantalla.

Después de ssh, ejecute screen. Esto iniciará otro shell que se ejecuta dentro de la pantalla. Ejecutar el comando, a continuación, hacer un Ctrl-un d.

Esta "desconexión" de la pantalla de la sesión. En este punto, usted puede salir o hacer cualquier otra cosa que quisiera.

Cuando se desea volver a conectarse a la sesión de pantalla, sólo tiene que ejecutar screen -RD desde el intérprete de comandos (como el mismo uso que el usuario que ha creado la sesión).

37voto

Korjavin Ivan Puntos 1063

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

27voto

Handyman5 Puntos 3517

Acaba de ser exhaustivo, voy a señalar tmux, que tiene la misma idea básica de pantalla:

tmux es la intención de ser un moderno, BSD, la licencia alternativa a programas como GNU pantalla. Las características principales incluyen:

  • Un potente, coherente, bien documentado y fácil de secuencias de comandos de comandos de la interfaz.
  • Una ventana puede ser dividida horizontalmente y verticalmente en los paneles.
  • Los paneles se pueden mover libremente y cambiar de tamaño, o dispuestos en diseños preestablecidos.
  • Soporte para UTF-8 y terminales de 256 colores.
  • Copiar y pegar con varios búferes.
  • Menús interactivos para seleccionar windows, o sesiones de los clientes.
  • Cambie la ventana actual mediante la búsqueda de texto en el destino.
  • Bloqueo de Terminal, de forma manual o después de un tiempo de espera.
  • Un limpio, ampliar fácilmente, BSD, la licencia codebase, bajo desarrollo activo.

Es, sin embargo, aproximadamente infinitamente más fácil buscar en Google.

8voto

erichui Puntos 1488

En bash, disown palabra clave es perfectamente adecuado para este. En primer lugar, ejecutar el proceso en segundo plano (ya sea de uso &o ^Z , a continuación, escriba bg):

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

Escribiendo jobs se puede ver que el proceso es todavía propiedad de la shell:

$ jobs
[1]+  Running  wget

Si se va a cerrar la sesión en este punto, la tarea en segundo plano también mueren. Sin embargo, si ejecuta disown, bash separa el trabajo y le permite seguir ejecutando:

$ disown

Usted puede confirmar esto:

$ jobs
$ logout

Usted puede incluso combinar la & 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 dejan nohup.out archivos cubrían todo su sistema de ficheros. También, nohup se debe ejecutar antes de ejecutar el comando - disown puede ser utilizado si usted sólo más tarde decide que desea fondo y separar la tarea.

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: