Cómo verificar el uso de ulimit


29

¿Hay alguna manera de verificar el uso de los ulimits para un usuario determinado? Sé que puede cambiar ulimits para un solo proceso cuando lo inicia o para un único shell cuando se ejecuta, pero quiero poder "monitorear" qué tan cerca está un usuario de alcanzar sus límites. Estoy planeando escribir un bashscript que informará a las estadísticas el porcentaje de uso actual. Específicamente, quiero rastrear:

  1. abrir archivos ( ulimit -n)
  2. max procesos de usuario ( ulimit -u)
  3. señales pendientes ( ulimit -i)

Lo que quiero es el porcentaje de uso (0-100).


Si tiene activada la contabilidad de procesos en su núcleo, puede recopilar estadísticas detalladas de uso sobre sus usuarios.
casey

¿Cómo se activa la contabilidad de procesos?
Hazmat

¿Y cuánto sobrecarga esto agrega?
Hazmat

Respuestas:


22

Quizás esto ayude para la primera pregunta:

Si conoce los ID de proceso (PID) del usuario específico, puede obtener los límites para cada proceso con:

cat /proc/<PID>/limits

Puede obtener el número de archivos abiertos para cada PID con:

ls -1 /proc/<PID>/fd | wc -l

Y luego simplemente compare el valor de Max open filescon el número de descriptores de archivo abiertos del segundo comando para obtener un porcentaje.


8

Imprima el porcentaje del usuario actual de archivos abiertos, proceso y señales pendientes, mediante varios métodos inconvenientes y herramientas estándar:

paste <(grep 'open files\|processes\|pending signals' /proc/self/limits | 
        cut -c27-38) \
      <(i=`whoami` ; lsof -u $i | tail -n +2 | awk {'print $9'} | wc -l; 
                     ps --no-headers -U $i -u $i u | wc -l ; 
                     ps -u $i -o pid= | xargs printf "/proc/%s/status\n" |
                                        xargs grep -s 'SigPnd' |
                                        sed 's/.*\t//' | paste -sd+ | bc ; ) |
while read a b ; do echo $((${b}00/a))%; done

Salida en mi sistema:

59%
9%
0%

Suponiendo que esos números son buenos, lo que muestra esta respuesta es que se puede hacer en shell, pero probablemente no, a menos que haya métodos de shell mucho mejores. Más bien, esta Q estaría mejor hecha con gcc, o python, etc.


-4

Los límites son propiedades de los procesos y se heredan a los procesos secundarios.

No puede obtener los límites para otro proceso.


2
Disparates. man lsof, man ps...
Gilles 'SO- deja de ser malvado'

1
Parece que no comprende cómo funciona UNIX y cómo lsof obtiene sus resultados. lsof lee la memoria del kernel para obtener valores, no existe una interfaz documentada que sea utilizada por lsof, por lo que lsof fallará en caso de que incluso se hayan realizado cambios menores en las estructuras internas de datos del kernel.
schily

2
Eso es un dolor de cabeza para el lsofmantenedor, claro. Pero no es relevante para el usuario final. También es incorrecto en el contexto de esta pregunta, ya que se trata específicamente de Linux, que tiene interfaces documentadas ( man proc).
Gilles 'SO- deja de ser malvado'

Está hablando de interfaces no documentadas que están sujetas a cambios sin previo aviso en este caso.
schily

1
No puedo rechazar esta causa de mi baja reputación, así que solo comentaré-1
Zun
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.