list open files (lsof)

por | octubre 30, 2014

lsof es una utilísima orden que nos muestra la información relacionada con los descriptores de archivo de nuestro sistema. Por ejemplo, cuando queremos desmontar un sistema de archivo y la respuesta es «Error: sistema ocupado», con ‘lsof +D /punto_de_montaje‘ podemos saber todos los procesos (la primera columna de la fila, o filas, que obtenemos como respuesta) que están utilizando dicho sistema de archivos (y actuar en consecuencia).

¿Qué más podemos saber con él? Pues conocer/obtener el listado de:

  • Los ficheros abiertos/en uso por un usuario: lsof -u usuario
  • Los relacionados con un grupo de usuarios: lsof -g grupo
  • Todos los que no estén relacionados con un grupo: lsof -g ^grupo (1)
  • Los descriptores relacionados con un proceso: lsof -p PID
    • O con una orden: lsof -c «command»
    • O todos los que han abierto un determinado fichero: lsof «fichero»
  • Las conexiones abiertas por un usuario: lsof -u usuario -i
  • El proceso que está utilizando un determinado puerto TCP: lsof -i TCP:puerto
  • Las conexiones del usuario entre puerto1 y puerto2:

lsof -a -i TCP:puerto1-puerto2 -u usuario    (2)

  • Las conexiones con host determinado: lsof [email protected]_host
  • Los puertos que están esperando conexiones: lsof -i -sTCP:LISTEN
  • Las que están en el estado ESTABLISHED: lsof -i -sTCP:ESTABLISHED
  • Los ficheros abiertos que han sido «deslinkados» (por ejemplo, los borrados mientras estaban en uso o los que «alguien» nos quiere ocultar) : lsof +L1

Y podemos realizar búsquedas más avanzadas, «juntando» varias de las anteriores. Por ejemplo: lsof -a -i -sTCP:LISTEN -u ^root nos muestra todos los puertos en espera de conexión NO abiertos por el usuario ‘root‘.

Por último, otra opción que considero interesante es ‘-|+ r tiempo‘; con ella se repetirá automáticamente la orden, cada t segundos, hasta que se cumpla la condición de finalización que hayamos definido. Si utilizamos -r, la orden se ejecutará hasta que reciba la señal de salida. Con +r, hasta que no haya más ficheros listados.

Tiene muchas más opciones por lo que os recomiendo la lectura de man lsof.

Referencias

  • man lsof

Notas:

(1) ^ sirve para negar. En el ejemplo, para indicar todos los que no estén relacionados con GID dado. También se puede utilizar en el resto de sentencias. Por ejemplo: lsof -u ^USUARIO para listar todos los que NO estén relacionados con el USUARIO

(2) La opción ‘-a’ sirve para hacer AND entre todos los resultados de aplicar las opciones indicadas (en vez de OR). En este ejemplo, para que sea tanto del usuario como que estén relacionados con un puerto entre puerto1 y puerto2