Solución 1:
El mejor método es iniciar el proceso en un multiplexor terminal. Alternativamente, puede hacer que el proceso no reciba la señal HUP.
Un multiplexor de terminal proporciona terminales "virtuales" que se ejecutan independientemente del terminal "real" (en realidad, todos los terminales de hoy 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 el terminal virtual seguirán ejecutándose con ese terminal virtual. Cuando te vuelvas a conectar al servidor podrás volver a conectarte a la terminal virtual y todo será como si nada hubiera pasado, salvo el tiempo que pasó.
Dos multiplexores de terminales populares son screen 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/
El terminal envía la señal HUP (o SIGHUP) 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 sencillos para hacerlo son nohup
y disown
.
Para obtener más información sobre cómo nohup
y disown
funciona lea esta pregunta y 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 principalmente útil para procesos por lotes de larga ejecución que, una vez iniciados, ya no necesitan ninguna intervención del usuario.
Solución 2:
Hay algunas formas de hacer esto, pero la que encuentro más útil es usar GNU Screen.
Después de entrar, ejecuta screen
. Esto iniciará otro shell ejecutándose dentro de la pantalla. Ejecute su comando, luego haga un Ctrl -a d .
Esto lo "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 shell (como el mismo usuario de uso que creó la sesión).
Solución 3:
En bash
, el disown
palabra clave se adapta perfectamente a esto. Primero, ejecute su proceso en segundo plano (o use &
o ^Z
luego escribe bg
):
$ wget --quiet http://server/some_big_file.zip &
[1] 1156
Al escribir jobs
puede ver que el proceso todavía es propiedad del shell:
$ jobs
[1]+ Running wget
Si tuviera que cerrar la sesión en este punto, la tarea en segundo plano también se eliminaría. Sin embargo, si ejecuta disown
, bash separa el trabajo y permite que continúe 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 ejecutar nohup
en mi opinión porque no deja nohup.out
archivos esparcidos por todo su sistema de archivos. Además, nohup
debe ejecutarse antes de ejecutar el comando:disown
se puede usar si decide más tarde que desea poner en segundo plano y separar la tarea.
Solución 4:
La herramienta nohup, disponible en la mayoría de las cajas de Linux, hará esto.
Solución 5:
Solo para ser exhaustivo, señalaré tmux, que tiene la misma idea básica que screen:
tmux pretende ser una alternativa moderna con licencia BSD a programas como GNU screen. Las características principales incluyen:
- Una interfaz de comandos poderosa, consistente, 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.
- Compatibilidad con UTF-8 y terminales de 256 colores.
- Copiar y pegar con múltiples búferes.
- 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 tiempo de espera.
- Un código base con licencia BSD, limpio y fácilmente ampliable, en desarrollo activo.
Sin embargo, es aproximadamente infinitamente más fácil de buscar en Google.