Número de ficheros abiertos por un proceso en Linux (Comandos de *NIX que siempre se me olvidan pt. I)
Hoy trabajando me ha surgido la necesidad de controlar el número de ficheros abiertos por un determinado proceso. Con 4 búsquedas por Google se encuentra rápido como mirar esto, pero para evitarme los engorros de siempre de tener que buscar de nuevo lo que ya he buscado y hecho voy a escribir aquí el proceso.
El comando clave es lsof (LiSt Open Files). Para ser puristas, lo que mira este comando son los descriptores de fichero abiertos por un proceso; Linux/los sistemas *NIX tratan a los ficheros como ficheros de disco, pero también trabajan de la misma manera con dispositivos del sistema, de manera que abrir un socket es bastante similar a abrir un fichero de texto que se guarda en disco.
A lo que vamos. Queremos saber qué ficheros tiene abiertos un proceso. Ejecutamos:
Y nos aparece el listado. Pero en mi caso, hoy quería saber el número de ficheros abiertos, no cuales eran. Ejecuto:
Generalmente lo que sabemos es el nombre del comando que se ejecuta, no el PID, de manera que tenemos que buscar con ps -axu | grep, seleccionar el proceso del que queremos conocer y ejecutamos el lsof. Automatizar esto es relativamente fácil:
Lo que hacemos con esto es ejecutar el lsof -p pero esta vez lo que le pasamos al comando es el resultado de la ejecución de
que lo que hace es devolvernos el PID de los procesos que se llamen Asterisk. Explicado paso a paso lo que hacemos es mostrar los procesos mediante ps, filtramos con grep aquellas lineas en las que aparezca asterisk y finalmente, del resultado obtenido mostramos la segunda columna.
Sucede que en ocasiones no hay un solo proceso que se llame de una manera, o más de una linea contiene el patrón por el que filtramos, de manera que vamos a rizar el rizo y vamos a filtrar más, que es lo que he tenido que hacer para quedarme solo con la linea que toca:
grep -v filtrará las lineas que sí contengan las palabras buscadas, en este caso filtro el proceso avahi, la cadena spool (ya que asterisk lanza el proceso sox para mezclar ficheros de audio cuando los está grabando y los guarda en la carpeta /var/spool/asterisk/recordings) y la cadena grep para no mostrar el proceso que estoy ejecutando. De esta manera, y en mi caso, solo queda una linea que es la que muestra el número de ficheros abiertos por el proceso Asterisk.
El comando clave es lsof (LiSt Open Files). Para ser puristas, lo que mira este comando son los descriptores de fichero abiertos por un proceso; Linux/los sistemas *NIX tratan a los ficheros como ficheros de disco, pero también trabajan de la misma manera con dispositivos del sistema, de manera que abrir un socket es bastante similar a abrir un fichero de texto que se guarda en disco.
A lo que vamos. Queremos saber qué ficheros tiene abiertos un proceso. Ejecutamos:
lsof -p 51
Y nos aparece el listado. Pero en mi caso, hoy quería saber el número de ficheros abiertos, no cuales eran. Ejecuto:
lsof -p 51 | wc -l
Generalmente lo que sabemos es el nombre del comando que se ejecuta, no el PID, de manera que tenemos que buscar con ps -axu | grep
/usr/sbin/lsof -p `ps -axu | grep asterisk \
|awk '{ print $2 }'` | wc -l
Lo que hacemos con esto es ejecutar el lsof -p pero esta vez lo que le pasamos al comando es el resultado de la ejecución de
ps -axu | grep asterisk |awk '{ print $2 }'que lo que hace es devolvernos el PID de los procesos que se llamen Asterisk. Explicado paso a paso lo que hacemos es mostrar los procesos mediante ps, filtramos con grep aquellas lineas en las que aparezca asterisk y finalmente, del resultado obtenido mostramos la segunda columna.
Sucede que en ocasiones no hay un solo proceso que se llame de una manera, o más de una linea contiene el patrón por el que filtramos, de manera que vamos a rizar el rizo y vamos a filtrar más, que es lo que he tenido que hacer para quedarme solo con la linea que toca:
/usr/sbin/lsof -p `ps -axu | grep asterisk | \
grep -v avahi | grep -v spool| grep -v grep |awk '{ print $2 }'` | wc -l
grep -v filtrará las lineas que sí contengan las palabras buscadas, en este caso filtro el proceso avahi, la cadena spool (ya que asterisk lanza el proceso sox para mezclar ficheros de audio cuando los está grabando y los guarda en la carpeta /var/spool/asterisk/recordings) y la cadena grep para no mostrar el proceso que estoy ejecutando. De esta manera, y en mi caso, solo queda una linea que es la que muestra el número de ficheros abiertos por el proceso Asterisk.
Etiquetas: bash, Informática, Linux, script, sistemas operativos

0 Comments:
Publicar un comentario
<< Home