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 terminales proporciona terminales "virtuales" que se ejecutan independientemente del terminal "real" (en realidad, todos los terminales actuales son "virtuales", pero ese es otro tema para otro día). El terminal virtual seguirá funcionando incluso si su terminal real está cerrada con su sesión ssh.
Todos los procesos iniciados desde la terminal virtual seguirán ejecutándose con esa terminal virtual. Cuando se vuelve a conectar al servidor, puede volver a conectarse a la terminal virtual y todo será como si nada hubiera pasado, salvo el tiempo transcurrido.
Dos multiplexores de terminal 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/
La señal HUP (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 finalizarán. Para evitar esto, puede hacer que sus 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 cómo 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á 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 entrada del usuario.
screen
le ofrece muchas más opciones, pero si está utilizandoauthorized_keys
para permitir que las personas ejecuten un script de forma remotassh
, lanohup
opción es una manera simple y agradable para que el script inicie procesos que duran más que lassh
sesión utilizada para iniciarlos. .Hay algunas maneras de hacer esto, pero la que encuentro más útil es usar GNU Screen .
Después de entrar, corre
screen
. Esto iniciará otro shell que se ejecuta 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 comandos de shell (como el mismo usuario de uso que creó la sesión).fuente
En
bash
, ladisown
palabra clave se adapta perfectamente a esto. Primero, ejecute su proceso en segundo plano (use&
o^Z
luego escribabg
):Al escribir
jobs
puede ver que el proceso todavía es propiedad del shell:Si tuviera que cerrar sesión en este punto, la tarea en segundo plano también sería eliminada. Sin embargo, si ejecuta
disown
, bash separa el trabajo y permite que continúe ejecutándose:Puedes confirmar esto:
Incluso puede combinar el
&
ydisown
en la misma línea, como:Esto es mejor que correr
nohup
en mi opinión porque no dejanohup.out
archivos llenos de basura en todo el sistema de archivos. Además,nohup
debe ejecutarse antes de ejecutar el comando;disown
se puede utilizar si solo decide más adelante que desea realizar un segundo plano y separar la tarea.fuente
La herramienta nohup, disponible en la mayoría de las cajas de Linux hará esto.
fuente
Solo para ser minucioso, señalaré tmux , que tiene la misma idea básica que la pantalla:
Sin embargo, es aproximadamente infinitamente más fácil de buscar en Google.
fuente
"gnu screen"
como su consulta de búsqueda funciona bastante bien.La pantalla es exagerada para mantener los procesos en ejecución cuando cierra la sesión.
Prueba dtach :
fuente
Aquí hay una manera de demonizar cualquier proceso de shell, no se necesitan programas externos:
Cuando cierre su sesión, el trabajo continuará ejecutándose como lo demuestra el archivo output.txt (que tiene almacenamiento en búfer, por lo que lleva un tiempo mostrar que no es cero). No olvides matar tu trabajo después de la prueba.
Entonces, todo lo que necesita hacer es cerrar la entrada estándar y poner en segundo plano el trabajo. Para ser realmente bueno, primero
cd /
para no aferrarte a una montura.Esto funciona incluso en sh simple bajo Solaris.
fuente
-
operador? ¿Cuál es la diferencia entre< /dev/null
y&-
? Supongo que a STDIN (y a otros STDOUT y STDERR) se les podría asignar un archivo< file
o una transmisión<& stream
en caso de STDIN. ¿Sería lo mismo usando< /dev/null
en su ejemplo anterior? ¿Y el operador-
anterior se refiere a un nulo como la secuencia?El
at
comando puede ser útil para este tipo de situación. Por ejemplo, escriba:Y luego puede ingresar un comando o una serie de comandos que se ejecutarán. Los resultados deben ser enviados por correo electrónico 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 comonow + 15 minutes
. Verman at
para más detalles.fuente
byobu
en Ubuntu es un buen front-end para la pantalla. Al presionar Ctrl, ?obtienes una lista de todos los atajos de teclado. Agrega una barra de estado que puede ser útil para ver 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 se puede redirigir a / dev / null si no es necesario.fuente