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?
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
Essaye ça:
ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {}
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