Matar procesos de usuario y limpiar archivos temporales en servidores LTSP | Algo de Linux

miércoles, 27 de noviembre de 2013

Matar procesos de usuario y limpiar archivos temporales en servidores LTSP

Cuando un usuario inicia sesión, a medida que va abriendo aplicaciones se van creando procesos y más procesos. Además, cuando inicia sesión en un thinclient, se crean archivos temporales en el directorio /tmp del servidor de terminales.  Si todo va bien, cuando cierre la sesión, todos sus procesos se cerrarán, aunque es posible que los archivos del directorio /tmp permanezcan por si el usuario vuelve a iniciar sesión. 

Pero, ¿qué sucede si el usuario apaga bruscamente el terminal desconectándolo de la corriente? ¿Y si el equipo se bloquea por algún motivo? En ese caso, lo más probable es que sus procesos queden abiertos en el servidor LTSP, creándonos casi seguro algún tipo de problema.

Para limpiar los procesos y los archivos temporales de un usuario que, en un momento determinado, no se encuentra activo en el sistema preparé el siguiente script que se ejecuta en el servidor de terminales:

#!/bin/bash
#
# Este script  elimina los ficheros temporales de los usuarios que no están activos en el sistema
# Esteban M. Navas Martín
# 20/06/2013

# Obtenemos la lista de usuarios que han iniciado sesión en terminales
w | grep '192.168.0' > /tmp/userstoclean

# Para cada usuario que haya iniciado sesión en un terminal...
while read SESION ; do

   USUARIO=`echo $SESION | cut -f1 -d" "`

   IP=`echo $SESION | cut -f3 -d" "`
   SESIONKO=`arp -i eth0 | grep 'incomplete' | grep $IP`

   if [ ! -z "$SESIONKO" ]; then
      # Borramos los temporales creados al iniciar sesión los usuarios en los terminales
      find /tmp -not -user root -user $USUARIO -exec rm -r {} \; 2>/dev/null

      # Matamos todos los procesos del usuario
      pkill -9 -u $USUARIO
   fi
done < /tmp/userstoclean

rm /tmp/userstoclean

Para que se ejecute de forma periódica cada cierto tiempo, no tenemos más que poner una tarea cron mediante puppet.

La idea de este script es examinar en la tabla ARP del servidor de terminales aquellas entradas que correspondan al interfaz que da servicio a los terminales, que en nuestro caso es eth0 y comprobar que en la entrada figura que la resolución IP - MAC está incompleta. Si no hay resolución y hay un usuario en el sistema que inició sesión en la red "192.168.0", podemos matar sus procesos porque el usuario no está logueado.

Dejo aquí el enlace del script, por si queréis descargarlo: cleantmpinactiveusers.

Publicado por primera vez en http://enavas.blogspot.com.es

2 comentarios:

ercari dijo...

Hola.

Gracias por el aporte. Pero en mi caso, un ubuntu server 12.04 la variable SESION está vacia, no contiene nada, y eso que tengo 10 clientes LTSP corriendo.

echo $SESION no me devuelve nada

Un saludo y gracias.

Esteban M. Navas Martín dijo...

La variable SESION va tomando como valor con cada línea del fichero userstoclean. Si echas un vistazo al código, verás que en este fichero se almacenan la lista de usuarios logueados en la red 192.168.0:

w | grep '192.168.0' > /tmp/userstoclean

Comprueba si te está funcionando la línea anterior.

Por otra parte, deberías modificar el script si tus terminales están en otra subred.

Como tienes el código completo, lo único que debes hacer para que te funcione es testearlo y adaptarlo a tus necesidades. En nuestro caso usamos Debian y algo puede diferir.