ver recursivo para ejemplos comando archivos abiertos linux bash ps

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