web-dev-qa-db-fra.com

Comment vérifier l'utilisation d'ulimit

Existe-t-il un moyen de vérifier l'utilisation des ulimits pour un utilisateur donné? Je sais que vous pouvez modifier les ulimits pour un seul processus lorsque vous le démarrez ou pour un seul shell lors de son exécution, mais je veux pouvoir "surveiller" à quel point un utilisateur est proche d'atteindre ses limites. Je prévois d'écrire un script bash qui rendra compte à statsd du pourcentage d'utilisation actuel. Plus précisément, je veux suivre:

  1. ouvrir des fichiers (ulimit -n)
  2. nombre maximal de processus utilisateur (ulimit -u)
  3. signaux en attente (ulimit -i)

Ce que je veux, c'est le pourcentage d'utilisation (0-100).

34
hazmat

Peut-être que cela aide pour la première question:

Si vous connaissez les ID de processus (PID) de l'utilisateur spécifique, vous pouvez obtenir les limites de chaque processus avec:

cat /proc/<PID>/limits

Vous pouvez obtenir le nombre de fichiers ouverts pour chaque PID avec:

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

Et puis il suffit de comparer la valeur de Max open files avec le nombre de descripteurs de fichiers ouverts de la deuxième commande pour obtenir un pourcentage.

25
m13r

Générez le pourcentage de fichiers ouverts, de proc et de signaux en attente de l'utilisateur actuel par plusieurs méthodes et outils standard peu pratiques:

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

Sortie sur mon système:

59%
9%
0%

En supposant que ces chiffres sont bons, cette réponse montre que cela peut être fait dans Shell, mais ne devrait probablement pas, à moins qu'il existe de bien meilleures méthodes Shell. Au contraire, ce Q serait mieux fait avec gcc, ou python, etc.

10
agc