Puoi provare a scrivere uno script che chiami periodicamente lsof -p {PID}
su un dato pid.
per vedere i primi 20 handle di file utilizzando i processi:
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
l'output è nel formato file handle count, pid, cmndline for process
output di esempio
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
Conta le voci in /proc/<pid>/fd/
. I limiti rigidi e flessibili applicabili al processo possono essere trovati in /proc/<pid>/limits
.
Le uniche interfacce fornite dal kernel Linux per ottenere i limiti delle risorse sono getrlimit()
e /proc/
pid /limits
. getrlimit()
può ottenere solo i limiti delle risorse del processo chiamante. /proc/
pid /limits
ti consente di ottenere i limiti delle risorse di qualsiasi processo con lo stesso ID utente ed è disponibile su RHEL 5.2, RHEL 4.7, Ubuntu 9.04 e qualsiasi distribuzione con un kernel 2.6.24 o successivo.
Se hai bisogno di supportare sistemi Linux più vecchi allora dovrai fare in modo che il processo stesso chiami getrlimit()
. Ovviamente il modo più semplice per farlo è modificare il programma o una libreria che utilizza. Se stai eseguendo il programma, puoi usare LD_PRELOAD
per caricare il tuo codice nel programma. Se nessuno di questi è possibile, puoi collegarti al processo con gdb e fare in modo che esegua la chiamata all'interno del processo. Puoi anche fare la stessa cosa tu stesso usando ptrace()
da allegare al processo, inserire la chiamata nella sua memoria, ecc., tuttavia è molto complicato da ottenere correttamente e non è consigliato.
Con i privilegi appropriati, gli altri modi per farlo implicherebbero la ricerca nella memoria del kernel, il caricamento di un modulo del kernel o la modifica in altro modo del kernel, ma presumo che questi siano fuori discussione.