5 formas de mantener las sesiones y los procesos SSH remotos en ejecución después de la desconexión


SSH o Secure Shell en términos simples es una forma en que una persona puede acceder de forma remota a otro usuario en otro sistema, pero solo en la línea de comandos, es decir, en modo sin GUI. En términos más técnicos, cuando accedemos a otro usuario en algún otro sistema y ejecutamos comandos en esa máquina, en realidad crea un pseudo-terminal y lo adjunta al shell de inicio de sesión del usuario que inició sesión.

Cuando salimos de la sesión o la sesión se agota después de estar inactiva durante bastante tiempo, la señal SIGHUP se envía al pseudo-terminal y a todos los trabajos que se han ejecutado en ese terminal, incluso los trabajos que tienen sus trabajos principales. que se inician en el pseudo-terminal también se les envía la señal SIGHUP y se les obliga a terminar.

Solo los trabajos que se han configurado para ignorar esta señal son los que sobreviven a la finalización de la sesión. En los sistemas Linux, podemos tener muchas formas de hacer que estos trabajos se ejecuten en el servidor remoto o en cualquier máquina incluso después del cierre de sesión del usuario y la finalización de la sesión.

Comprender los procesos en Linux

Los procesos normales son aquellos que tienen una duración de una sesión. Se inician durante la sesión como procesos en primer plano y terminan en un período de tiempo determinado o cuando se cierra la sesión. Estos procesos tienen como propietario a cualquiera de los usuarios válidos del sistema, incluido el root.

Los procesos huérfanos son aquellos que inicialmente tenían un padre que creó el proceso, pero después de un tiempo, el proceso padre murió o se bloqueó involuntariamente, lo que hizo que init fuera el padre de ese proceso. Dichos procesos tienen a init como su padre inmediato, que espera estos procesos hasta que mueren o terminan.

Estos son algunos procesos intencionalmente huérfanos, los procesos que se dejan intencionalmente en ejecución en el sistema se denominan demonios o procesos intencionalmente huérfanos. Por lo general, son procesos de larga ejecución que se inician una vez y luego se desconectan de cualquier terminal de control para que puedan ejecutarse en segundo plano hasta que no se completen o terminen arrojando un error. El padre de tales procesos muere intencionalmente haciendo que el niño se ejecute en segundo plano.

Técnicas para mantener la sesión SSH en ejecución después de la desconexión

Puede haber varias formas de dejar las sesiones ssh ejecutándose después de la desconexión, como se describe a continuación:

screen es un administrador de ventanas de texto para Linux que permite al usuario administrar múltiples sesiones de terminal al mismo tiempo, cambiar entre sesiones, registrar sesiones para las sesiones en ejecución en la pantalla e incluso reanudar la sesión en cualquier momento que deseemos sin preocuparse de que la sesión se registre fuera o el terminal está cerrado.

Las sesiones de pantalla se pueden iniciar y luego desconectar del terminal de control dejándolas ejecutándose en segundo plano y luego reanudarse en cualquier momento e incluso en cualquier lugar. Solo necesitas iniciar tu sesión en la pantalla y cuando quieras, desconectarla del pseudo-terminal (o el terminal de control) y cerrar la sesión. Cuando se sienta, puede volver a iniciar sesión y reanudar la sesión.

Después de escribir el comando "pantalla", estará en una nueva sesión de pantalla, dentro de esta sesión puede crear nuevas ventanas, atravesar ventanas, bloquear la pantalla y hacer muchas más cosas que puede hacer en una terminal normal.

$ screen

Una vez iniciada la sesión de pantalla, puede ejecutar cualquier comando y mantener la sesión en funcionamiento desconectando la sesión.

Justo cuando desea cerrar la sesión remota, pero desea mantener viva la sesión que creó en esa máquina, lo que debe hacer es desconectar la pantalla del terminal para que no quede ningún terminal de control. Después de hacer esto, puede cerrar la sesión de forma segura.

Para desconectar una pantalla del terminal remoto, simplemente presione “Ctrl + a” seguido inmediatamente por “d” y volverá al terminal y verá el mensaje de que la pantalla está separado. Ahora puede cerrar la sesión de forma segura y su sesión se mantendrá viva.

Si desea reanudar una sesión de pantalla separada que dejó antes de cerrar la sesión, simplemente vuelva a iniciar sesión en el terminal remoto y escriba "screen -r" en caso de que solo se abra una pantalla y si hay varias las sesiones de pantalla se abren, ejecute “screen -r .

$ screen -r
$ screen -r <pid.tty.host>

Para obtener más información sobre el comando de pantalla y cómo usarlo, simplemente siga el enlace: Use el comando de pantalla para administrar sesiones de terminal de Linux

Tmux es otro software creado para reemplazar la pantalla. Tiene la mayoría de las capacidades de la pantalla, con pocas capacidades adicionales que la hacen más poderosa que la pantalla.

Permite, además de todas las opciones que ofrece la pantalla, dividir los paneles horizontal o verticalmente entre varias ventanas, cambiar el tamaño de los paneles de las ventanas, monitorear la actividad de la sesión, crear scripts usando el modo de línea de comandos, etc. Debido a estas características de tmux, ha disfrutado de una amplia adopción por parte de casi todas las distribuciones de Unix e incluso se ha incluido en el sistema base de OpenBSD.

Después de hacer ssh en el host remoto y escribir tmux, entrará en una nueva sesión con una nueva ventana que se abrirá frente a usted, en la que podrá hacer cualquier cosa que haga en una terminal normal.

$ tmux

Después de realizar sus operaciones en el terminal, puede desconectar esa sesión del terminal de control para que pase a segundo plano y pueda cerrar la sesión de forma segura.

O puede ejecutar “tmux detach” en la ejecución de la sesión tmux o puede usar el atajo (Ctrl + b luego d) . Después de esto, su sesión actual se desconectará y volverá a su terminal desde donde podrá cerrar la sesión de forma segura.

$ tmux detach

Para volver a abrir la sesión que desconectó y dejó como estaba cuando cerró la sesión del sistema, simplemente vuelva a iniciar sesión en la máquina remota y escriba "tmux attach" para volver a conectarse a la sesión cerrada y todavía estará allí y ejecutándose .

$ tmux attach

Para obtener más información sobre tmux y cómo usarlo, simplemente siga el enlace: Use Tmux Terminal Multiplexer para administrar múltiples terminales Linux.

Si no está tan familiarizado con screen o tmux, puede usar nohup y enviar su comando de ejecución prolongada a segundo plano para que pueda continuar mientras el comando seguirá ejecutándose en segundo plano. Después de eso, puede cerrar la sesión de forma segura.

Con el comando nohup le decimos al proceso que ignore la señal SIGHUP que envía la sesión ssh al finalizar, lo que hace que el comando persista incluso después del cierre de sesión. Al cerrar la sesión, el comando se desconecta del terminal de control y sigue ejecutándose en segundo plano como proceso demonio.

Aquí, hay un escenario simple en el que hemos ejecutado el comando find para buscar archivos en segundo plano en la sesión ssh usando nohup, después de lo cual la tarea se envió a un segundo plano con un mensaje que regresa inmediatamente dando PID e ID de trabajo del proceso ([ JOBID] PID) .

# nohup find / -type f $gt; files_in_system.out 2>1 &

Cuando vuelva a iniciar sesión, puede verificar el estado del comando, traerlo de nuevo al primer plano usando fg% JOBID para monitorear su progreso y así sucesivamente. A continuación, el resultado muestra que el trabajo se completó, ya que no se muestra al volver a iniciar sesión y ha proporcionado el resultado que se muestra.

# fg %JOBID

Otra forma elegante de permitir que su comando o una sola tarea se ejecute en segundo plano y permanezca vivo incluso después del cierre de sesión o la desconexión es mediante disown.

Disown, elimina el trabajo de la lista de trabajos de proceso del sistema, por lo que el proceso está protegido de ser eliminado durante la desconexión de la sesión, ya que no recibirá SIGHUP por el shell cuando cierre la sesión.

La desventaja de este método es que debe usarse solo para los trabajos que no necesitan ninguna entrada de stdin y tampoco necesitan escribir en stdout, a menos que redirija específicamente la entrada y salida de trabajos, porque cuando el trabajo intentará interactuar con stdin o stdout, se detendrá.

A continuación, enviamos el comando ping al fondo para que ut siga ejecutándose y se elimine de la lista de trabajos. Como se ve, el trabajo se suspendió primero, después de lo cual todavía estaba en la lista de trabajos como ID de proceso: 15368.

$ ping tecmint.com > pingout &
$ jobs -l
$ disown -h %1
$ ps -ef | grep ping

Después de esa señal de rechazo se pasó al trabajo y se eliminó de la lista de trabajos, aunque todavía se estaba ejecutando en segundo plano. El trabajo aún se estaría ejecutando cuando volviera a iniciar sesión en el servidor remoto como se muestra a continuación.

$ ps -ef | grep ping

Otra utilidad para lograr el comportamiento requerido es setsid. Nohup tiene una desventaja en el sentido de que el grupo de procesos del proceso sigue siendo el mismo, por lo que el proceso que se ejecuta con nohup es vulnerable a cualquier señal enviada a todo el grupo de procesos (como Ctrl + C ).

setsid, por otro lado, asigna un nuevo grupo de procesos al proceso que se está ejecutando y, por lo tanto, el proceso creado está totalmente en un grupo de procesos recién asignado y puede ejecutarse de manera segura sin temor a ser eliminado incluso después del cierre de sesión.

Aquí, muestra que el proceso ‘sleep 10m’ se ha separado del terminal de control, desde el momento en que se creó.

$ setsid sleep 10m
$ ps -ef | grep sleep

Ahora, cuando vuelva a iniciar sesión en la sesión, aún encontrará este proceso en ejecución.

$ ps -ef | grep [s]leep

Conclusión

¿Qué formas se le ocurren para mantener el proceso en ejecución incluso después de cerrar la sesión SSH? Si se le ocurre alguna otra forma eficiente, menciónelo en sus comentarios.