web-dev-qa-db-fra.com

Compter les fichiers ouverts par processus

Je travaille sur une application qui surveille les ressources des processus et fournit un rapport périodique sous Linux, mais j'ai rencontré un problème lors de l'extraction du nombre de fichiers ouverts par processus.

Cela prend un certain temps si je prends tous les fichiers et les regroupe selon leur PID et les compte.

Comment puis-je prendre le nombre de fichiers ouverts pour chaque processus sous Linux?

29
Aladdin

Jetez un œil au /proc/ système de fichiers:

ls /proc/$pid/fd/ | wc -l

Pour ce faire pour tous les processus, utilisez ceci:

cd /proc
for pid in [0-9]*
do
    echo "PID = $pid with $(ls /proc/$pid/fd/ | wc -l) file descriptors"
done

EDIT: Crédit à @Boban pour cet addendum: vous pouvez diriger la sortie du script ci-dessus dans le script suivant pour voir les dix processus (et leurs noms) qui ont le plus de descripteurs de fichiers ouverts:

  ...
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

Voici une autre approche pour répertorier les dix premiers processus avec les fds les plus ouverts, probablement moins lisibles, donc je ne le mets pas en avant:

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
54
Alfe

Essaye ça:

ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {}
6
Cokorda Raka

Je l'ai utilisé pour trouver les principaux processus consommant des gestionnaires de fichiers pour un utilisateur donné (nom d'utilisateur) où n'ont pas accès lsof ou root:

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
2
JG_