lunes, 1 de abril de 2013

Screen una terminal que puede ser inmortal

El motivo de esta entrada y el título es para hablar de uno de los programas de terminal que desde mi punto de vista es de los más potentes e importantes que hay que saber dominar, el comando screen.

Este programa sirve para crear terminales de forma que nos podemos desenganchar de ellas y que sigan ejecutándose y en un futuro volvernos a enganchar, es muy útil para administrar sistemas remotamente, usando el protocolo ssh, por ejemplo. Imaginemos que tenemos un ordenador remoto que usa debian y necesitamos actualizar el sistema. Por lo general lo haríamos mediante apt-get upgrade, pero este proceso dependiendo de lo que tenga que actualizar puede tardar un rato en ejecutarse y nosotros por la razón que sea, podemos tener la necesidad de cerrar la conexión remota. Sino lo hacemos con un programa tipo screen, al cerrar la conexión remota, se interrumpiría el proceso de actualización.

Suele venir por defecto en muchas distribuciones de linux, pero sino viene, seguro que estará en el respectivo gestor de paquetes de nuestra distribución, por ejemplo, para distribuciones basadas en debian, que pueden ser ubuntu, linux mint y raspbian entre otras, lo instalamos.


  • sudo apt-get update
  • sudo apt-get install screen

Vamos a poner un ejemplo típico de uso:

  • screen -S prueba

Con esto creamos un terminal que nos podremos referir usando la étiqueta prueba, mediante el parámetro -S le ponemos la étiqueta.

En este terminal, podemos ejecutar un proceso infinito, por ejemplo

  • ping terra.es

Para desconectarnos del terminal y que el proceso se siga ejecutando, pulsamos las teclas Ctrl + a  d. Con esto nos hemos desenganchado de la sesión etiquetada como prueba, pero el proceso se sigue ejecutando.

Si en un futuro queremos volver a conectarnos a ese proceso ejecutaríamos

  • screen -r -S prueba

y nos engancharíamos de nuevo a la terminal y al proceso. Este es el uso básico del comando, permite crear varias shells a la vez incluso en varias pantallas (cuando eso se hace, la shell principal se divide en dos) y se puede ir alternando entre shells.

Si quisiéramos por ejemplo lanzar un proceso en ejecución en un screen y que actuará en background, se haría:


  • screen -d -m -S procesoPing ping terra.es

Eso lanzaría un screen ejecutando el comando ping terra.es, que nos podríamos conectar a dicho screen de dos formas o a través del PID o a través de la etiqueta procesoPing.

  • screen -r PID
o bien

  • screen -r -S procesoPing

también podemos ver una lista de los diferentes screen que hay en marcha:

  • screen -list

De ahí podemos obtener el PID para engancharnos o ver las diferentes etiquetas que hemos definido al lanzar los procesos.

El PID también lo podemos ver si hacemos una búsqueda con el comando ps

  • ps axu | grep -i screen

O bien, si ejecutamos screen -r sin nada más nos saldrán las diferentes screen que tenemos en marcha.


Para más información aquí hay un excelente tutorial de uso.