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).

materiales peligrosos
fuente
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.

m13r
fuente
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.

agc
fuente
-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.

astuto
fuente
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