So überprüfen Sie die Verwendung von ulimit

29

Gibt es eine Möglichkeit, die Verwendung der ulimits für einen bestimmten Benutzer zu überprüfen? Ich weiß, dass Sie ulimits für einen einzelnen Prozess ändern können, wenn Sie ihn starten, oder für eine einzelne Shell, wenn Sie ausgeführt werden, aber ich möchte in der Lage sein, zu "überwachen", wie nah ein Benutzer an den Grenzwerten ist. Ich plane, ein bashSkript zu schreiben, das den aktuellen Nutzungsprozentsatz zurückmeldet. Insbesondere möchte ich verfolgen:

  1. offene Dateien ( ulimit -n)
  2. max benutzer prozesse ( ulimit -u)
  3. anstehende Signale ( ulimit -i)

Was ich herausfinden möchte, ist der Prozentsatz der Nutzung (0-100).

Hazmat
quelle
Wenn in Ihrem Kernel die Prozessabrechnung aktiviert ist, können Sie detaillierte Nutzungsstatistiken über Ihre Benutzer erfassen.
Casey
Wie aktivieren Sie die Prozessabrechnung?
Hazmat
Und wie viel Aufwand entsteht dadurch?
Hazmat

Antworten:

22

Vielleicht hilft das bei der ersten Frage:

Wenn Sie die Prozess-IDs (PIDs) des jeweiligen Benutzers kennen, können Sie die Grenzwerte für jeden Prozess folgendermaßen ermitteln:

cat /proc/<PID>/limits

Sie können die Anzahl der geöffneten Dateien für jede PID erhalten mit:

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

Vergleichen Sie dann einfach den Wert von Max open filesmit der Anzahl der geöffneten Dateideskriptoren aus dem zweiten Befehl, um einen Prozentsatz zu erhalten.

m13r
quelle
8

Den Prozentsatz der geöffneten Dateien, der Verarbeitung und der anstehenden Signale des aktuellen Benutzers mit verschiedenen unbequemen Methoden und Standardtools ausgeben:

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

Ausgabe auf meinem System:

59%
9%
0%

Vorausgesetzt, diese Zahlen sind gut, zeigt diese Antwort, dass dies in der Shell möglich ist, aber wahrscheinlich nicht sollte, es sei denn, es gibt viel bessere Shell-Methoden. Eher wäre dieses Q besser mit gcc, oder python, etc. zu machen.

agc
quelle
-4

Ulimits sind Eigenschaften von Prozessen und werden an untergeordnete Prozesse vererbt.

Sie können die Grenzen für einen anderen Prozess nicht abrufen.

schily
quelle
2
Unsinn. man lsof, man ps, ...
Gilles 'SO- Anschlag Sein Übel'
1
Sie scheinen nicht zu verstehen, wie UNIX funktioniert und wie es zu Ergebnissen kommt. lsof liest den Kernel-Speicher, um Werte abzurufen. Es gibt keine dokumentierte Schnittstelle, die von lsof verwendet wird. Daher schlägt lsof fehl, wenn auch nur geringfügige Änderungen an internen Kernel-Datenstrukturen vorgenommen wurden.
Schily
2
Das bereitet dem lsofBetreuer Kopfschmerzen . Für den Endbenutzer jedoch nicht relevant. Ebenfalls falsch im Zusammenhang mit dieser Frage, da speziell nach Linux gefragt wird, das Schnittstellen ( man proc) dokumentiert hat .
Gilles 'SO- hör auf böse zu sein'
Sie sprechen von undokumentierten Schnittstellen, die in diesem Fall ohne vorherige Ankündigung geändert werden können.
Schily
1
Ich kann diesen Grund für meine niedrigen Wiederholungszahlen nicht ablehnen, also werde ich nur einen Kommentar abgeben -1
Zun