Gestión de procesos conectados a un terminal

No sabía que nombre ponerle a este artículo. De hecho aún no lo sé. En inglés lo hubiera titulado Linux terminal job management pero Gestión de trabajos en terminales Linux no transmite lo mismo. Quizás Gestión de procesos en terminales Linux se acerca más pero no acaba de dar la idea. De lo que quiero hablar aquí es de algunas utilidades que permiten gestionar procesos de larga duración que queremos lanzar conectados a un terminal (normalmente vía SSH) y que habitualmente pueden proporcionar algún desafío.

Probablemente todos hemos pasado por la misma fase de aprendizaje al conectar mediante SSH a un terminal Linux. Básicamente nos podemos encontrar dos problemas:

  1. Lanzamos un proceso que acaba tardando más de lo esperado y querríamos desconectar la sesión y dejarle hacer el trabajo. Como el típico ^Z pero un poco más allá.
  2. Estamos ejecutando un proceso que no es necesariamente muy largo (quizás simplemente interactivo) y por algún problema de red perdemos la conexión SSH. Habitual para conexiones en movilidad (3G especialmente).Paso pues a comentar tres herramientas que nos permitirán gestionar la mayoría de estos casos, ya sea en previsión o a posteriori.

screen

La herramienta reina de esta categoría. Es lo que se conoce como multiplexor de terminal, y no es el único. Básicamente screen es un cliente de terminal en sí mismo, al que nos conectamos de un terminal. Por tanto estamos desacoplando el terminal de nuestra conexión y, en caso de desconexión, simplemente podemos reconectar. Por supuesto no tiene que ser una desconexión por error, yo utilizo habitualmente screen para lanzar trabajos largos y poder volver a conectar en el punto donde estaba más tarde y/o desde otro dispositivo. Las funcionalidades de screen van mucho más allá de desacoplar la conexión del terminal, ya que permite múltiples ventanas, portapapeles interno, opciones de registro...Hay mucha información y ejemplos sobre screen por la red, google es nuestro amigo.

nohup

Hay veces que simplemente queremos lanzar y olvidar un proceso un poco largo para que se ejecute en segundo plano. Pero no necesitamos utilizar toda la potencia de screen, o no la tenemos disponible. Con el comando nohup lanzamos un proceso que está protegido de la señal hang up que envia un terminal a sus procesos al desconectar. Al desacoplarse del terminal el comando redirige la salida estandar a un fichero. La verdad es que desde que utilizo screen apenas uso el nohup para nada.

disown

Los dos anteriores comandos tienen la particularidad que requieren previsión por nuestra parte. Pero ¿qué pasa con aquellos comandos que una vez lanzados tardan demasiado y queremos dejar en segundo plano? Lo primero es lanzar un ^Z y luego un bg para suspender y ejecutar en segundo plano, respectivamente, el comando en curso. Muchas veces es suficiente pero ¿y sí el comando requiere más tiempo del que podemos o queremos disponer con la conexión SSH al terminal? Aquí es donde disown nos ayuda a desposeer el proceso y cerrar tranquilamente el terminal. Por supuesto es el comando con menos funcionalidad pero podemos considerar que es uno de emergencia cuando hemos olvidado ejecutar el comando bajo screen.