GNU/Linux >> Tutoriels Linux >  >> Linux

Comptage des fichiers ouverts par processus

Essayez ceci :

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

J'ai utilisé ceci pour trouver les principaux processus consommant des gestionnaires de fichiers pour un utilisateur donné (nom d'utilisateur) sans 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

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

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

Pour faire cela 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

En une seule ligne (filtrer en ajoutant | grep -v "0 FDs" ):

for pid in /proc/[0-9]*; do printf "PID %6d has %4d FDs\n" $(basename $pid) $(ls $pid/fd | wc -l); done

En une seule ligne incluant le nom de la commande, trié par nombre de descripteurs de fichiers dans l'ordre décroissant (limitez les résultats en ajoutant | head -10 ):

for pid in /proc/[0-9]*; do p=$(basename $pid); printf "%4d FDs for PID %6d; command=%s\n" $(ls $pid/fd | wc -l) $p "$(ps -p $p -o comm=)"; done | sort -nr

Crédit à @Boban pour cet addendum :

Vous pouvez diriger la sortie du script ci-dessus vers 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 lister les dix meilleurs processus avec les fds les plus ouverts, probablement moins lisibles, donc je ne le mets pas devant :

find /proc -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

Linux
  1. Résolution de l'erreur Mysql :Trop de fichiers ouverts

  2. Vérifier la limite FD ouverte pour un processus donné sous Linux

  3. umask actuel d'un processus avec <pid>

  4. Les fichiers .pid sont-ils fiables pour déterminer si un processus est en cours d'exécution ?

  5. Comment obtenir le pid du processus qui vient de démarrer

Comment augmenter la limite du nombre de fichiers ouverts sous Linux

Construire des conteneurs à la main :l'espace de noms PID

Comment identifier un processus qui n'a pas de PID ?

Comment trouver le nom du processus à partir de son PID

Comment puis-je savoir quels fichiers un processus a ouverts ?

Variables d'environnement d'un processus en cours d'exécution sous Unix ?