linux - recursivo - Contando archivos abiertos por proceso
lsof linux (3)
Eche un vistazo al sistema de archivos /proc/
:
ls /proc/$pid/fd/ | wc -l
Para hacer esto para todos los procesos, usa esto:
cd /proc
for pid in [0-9]*
do
echo "PID = $pid with $(ls /proc/$pid/fd/ | wc -l) file descriptors"
done
EDIT: Crédito a @Boban por este apéndice: puede canalizar la salida del script anterior en el siguiente script para ver los diez procesos (y sus nombres) que tienen la mayoría de los descriptores de archivos abiertos:
...
done | sort -rn -k5 | head | while read -r _ _ pid _ fdcount _
do
command=$(ps -o cmd -p "$pid" -hc)
printf "pid = %5d with %4d fds: %s/n" "$pid" "$fdcount" "$command"
done
Aquí hay otro enfoque para enumerar los diez procesos principales con los fds más abiertos, probablemente menos legibles, así que no lo pongo al frente:
find -maxdepth 1 -type d -name ''[0-9]*'' /
-exec bash -c "ls {}/fd/ | wc -l | tr ''/n'' '' ''" /; /
-printf "fds (PID = %P), command: " /
-exec bash -c "tr ''/0'' '' '' < {}/cmdline" /; /
-exec echo /; | sort -rn | head
Estoy trabajando en una aplicación que supervisa los recursos de los procesos y proporciona un informe periódico en Linux, pero tuve un problema al extraer el recuento de archivos abiertos por proceso.
Esto toma bastante tiempo si tomo todos los archivos y los agrupo de acuerdo con su PID y los cuento.
¿Cómo puedo tomar el conteo de archivos abiertos para cada proceso en Linux?
Prueba esto:
ps aux | sed 1d | awk ''{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}'' | xargs -I {} bash -c {}
Utilicé esto para encontrar los mejores procesos que consumen el manejador de archivos para un usuario determinado (nombre de usuario) donde no tengo acceso de raíz o lsof:
for pid in `ps -o pid -u username` ; do echo "$(ls /proc/$pid/fd/ 2>/dev/null | wc -l ) for PID: $pid" ; done | sort -n | tail