Vous pouvez essayer d'écrire un script qui appelle périodiquement lsof -p {PID}
sur le pid donné.
pour voir le top 20 des descripteurs de fichiers utilisant des processus :
for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20
la sortie est au format file handle count, pid, cmndline for process
exemple de sortie
701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle
Comptez les entrées dans /proc/<pid>/fd/
. Les limites dures et souples s'appliquant au processus peuvent être trouvées dans /proc/<pid>/limits
.
Les seules interfaces fournies par le noyau Linux pour obtenir des limites de ressources sont getrlimit()
et /proc/
pid /limits
. getrlimit()
ne peut obtenir que les limites de ressources du processus appelant. /proc/
pid /limits
vous permet d'obtenir les limites de ressources de n'importe quel processus avec le même identifiant d'utilisateur, et est disponible sur RHEL 5.2, RHEL 4.7, Ubuntu 9.04 et toute distribution avec un noyau 2.6.24 ou ultérieur.
Si vous devez prendre en charge des systèmes Linux plus anciens, vous devrez faire en sorte que le processus lui-même appelle getrlimit()
. Bien sûr, le moyen le plus simple de le faire est de modifier le programme ou une bibliothèque qu'il utilise. Si vous exécutez le programme, vous pouvez utiliser LD_PRELOAD
pour charger votre propre code dans le programme. Si rien de tout cela n'est possible, vous pouvez vous attacher au processus avec gdb et lui faire exécuter l'appel dans le processus. Vous pouvez également faire la même chose vous-même en utilisant ptrace()
à rattacher au processus, insérer l'appel dans sa mémoire, etc., cependant c'est très compliqué à faire correctement et n'est pas recommandé.
Avec les privilèges appropriés, les autres façons de procéder impliqueraient de parcourir la mémoire du noyau, de charger un module du noyau ou de modifier autrement le noyau, mais je suppose que cela est hors de question.