Sie können versuchen, ein Skript zu schreiben, das regelmäßig lsof -p {PID}
aufruft auf gegebener PID.
um die Top 20 Dateihandles mit Prozessen zu sehen:
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
die Ausgabe erfolgt im Format file handle count, pid, cmndline for process
Beispielausgabe
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
Zählen Sie die Einträge in /proc/<pid>/fd/
. Die für das Verfahren geltenden harten und weichen Grenzen sind in /proc/<pid>/limits
zu finden .
Die einzigen vom Linux-Kernel bereitgestellten Schnittstellen zum Abrufen von Ressourcenbeschränkungen sind getrlimit()
und /proc/
pid /limits
. getrlimit()
kann nur Ressourcengrenzen des aufrufenden Prozesses erhalten. /proc/
pid /limits
ermöglicht es Ihnen, die Ressourcengrenzen jedes Prozesses mit derselben Benutzer-ID abzurufen, und ist auf RHEL 5.2, RHEL 4.7, Ubuntu 9.04 und jeder Distribution mit Kernel 2.6.24 oder höher verfügbar.
Wenn Sie ältere Linux-Systeme unterstützen müssen, müssen Sie den Prozess selbst dazu bringen, getrlimit()
aufzurufen . Der einfachste Weg, dies zu tun, besteht natürlich darin, das Programm oder eine Bibliothek, die es verwendet, zu modifizieren. Wenn Sie das Programm ausführen, können Sie LD_PRELOAD
verwenden eigenen Code in das Programm zu laden. Wenn nichts davon möglich ist, können Sie sich mit gdb an den Prozess anhängen und ihn den Aufruf innerhalb des Prozesses ausführen lassen. Sie können dasselbe auch selbst mit ptrace()
tun an den Prozess anzuhängen, den Aufruf in seinen Speicher einzufügen usw. Dies ist jedoch sehr kompliziert und wird nicht empfohlen.
Mit den entsprechenden Privilegien wären die anderen Möglichkeiten, dies zu tun, das Durchsuchen des Kernel-Speichers, das Laden eines Kernel-Moduls oder das Ändern des Kernels auf andere Weise, aber ich gehe davon aus, dass dies nicht in Frage kommt.