Puede intentar escribir un script que llame periódicamente a lsof -p {PID}
en el pid dado.
para ver los 20 principales manejadores de archivos usando procesos:
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 salida tiene el formato de cuenta de identificadores de archivo, pid, cmndline para el proceso
salida de ejemplo
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
Cuente las entradas en /proc/<pid>/fd/
. Los límites estrictos y flexibles que se aplican al proceso se pueden encontrar en /proc/<pid>/limits
.
Las únicas interfaces proporcionadas por el kernel de Linux para obtener límites de recursos son getrlimit()
y /proc/
pid /limits
. getrlimit()
solo puede obtener los límites de recursos del proceso de llamada. /proc/
pid /limits
le permite obtener los límites de recursos de cualquier proceso con la misma identificación de usuario y está disponible en RHEL 5.2, RHEL 4.7, Ubuntu 9.04 y cualquier distribución con un kernel 2.6.24 o posterior.
Si necesita admitir sistemas Linux más antiguos, deberá hacer que el proceso en sí llame a getrlimit()
. Por supuesto, la forma más fácil de hacerlo es modificando el programa o una biblioteca que utiliza. Si está ejecutando el programa, podría usar LD_PRELOAD
para cargar su propio código en el programa. Si nada de eso es posible, puede adjuntar al proceso con gdb y hacer que ejecute la llamada dentro del proceso. También podrías hacer lo mismo tú mismo usando ptrace()
adjuntar al proceso, insertar la llamada en su memoria, etc., sin embargo esto es muy complicado de acertar y no es recomendable.
Con los privilegios apropiados, las otras formas de hacer esto implicarían mirar a través de la memoria del núcleo, cargar un módulo del núcleo o modificar el núcleo de otra manera, pero asumo que esto está fuera de discusión.