ulimit
Ulimit sollte in der Datei „/etc/profile“ konfiguriert werden. Die entsprechende Zeile sieht meistens ungefähr so aus:
ulimit -n 100 -u 20 -m 200000 -d 200000 -s 8192 -c 200000 -v 200000 2>/dev/null
Anzeigen der aktuellen Einstellungen auf einem Debian7 System (User root):
ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 63590 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 63590 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
Auf einem Fedora20-System sehen die Werte ähnlich aus. Zum Vergleich hier die Einstellungen eines normalen Benutzers (user) und des Administrators (root). Was sofort auffällt ist, dass der Benutzer root viel mehr Prozesse starten darf. Dies liegt natürlich auch daran, dass viele Systemprozesse als root gestartet werden.
[user@fedora20]$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 14931 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
[root@fedora20]$# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 14931 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 14931 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
Für die aktuelle Shell (nicht Systemweit) kann ein Wert temporär geändert werden. Da lsof bereits in der Auflistung (-a) die weiteren Optionen anzeigt, kann man auf die Hilfe verzeichten. Wenn die erlaubten, maximal gleichzeitig geöffneten Dateien geändert werden sollen, kann dies mit folgendem Befehl erledigt werden.
ulimit -n 3000
Wenn der Benutzer nun erneut „ulimit -a“ ausführt, wird er die Änderung unter „Open Files“ finden. Dieser Wert sollte nun nämlich auf 3000 gesetzt sein.
Natürlich hat nicht jeder Benutzer genügend Rechte um alle Werte zu modifizieren. Entsprechend wird dann eine Fehlermeldung ausgegeben.
Normale Benutzer können ihr Limit jeweils bis zum definierten Hard-Limit erhöhen.
ulimit -u 14931 bash: ulimit: max user processes: Kann die Grenze nicht ändern: Die Operation ist nicht erlaubt
ulimit Hard- und Soft-Limits
Aus ulimit kann mit Hard- und Soft-Limits umgehen. Die Hard-Limits können nur vom root gesetzt werden.
- ulimit -aS (Soft-Limit)
- ulimit -aH (Hard-Limit)
Diese Kommandos zeigen entsprechend die aktuellen Hard-Limits (-aH) oder entsprechend die Soft-Limits (-aS).
- ulimit -c 30000 – die Maximalgrösse für core-files ist 30 MB.
- ulimit -d 12000 – die maximale Datengrösse eines Programms ist 12 MB.
- ulimit -Sd $(ulimit -Hd) limitiert die Grösse des Softlimits für die maximale
Datengrösse eines Programms auf die Grösse des korrespondierenden Hard-
limits.
Geöffnete Dateien überwachen mit lsof
Manchmal ist es nötig festzustellen, welche Dateien von welchem Benutzer gerade geöffnet sind. Dazu wird der Befehl „lsof“ verwendet. Um die Anzahl der offenen Dateien anzuzeigen, kann lsof mit dem Befehl „wc -l“ kombiniert werden.
lsof |wc -l
Kann ein Laufwerk nicht abgemeldet (umount) werden, kann mit lsof auch festgestellt werden, welche Dateien auf dem Datenträger noch geöffnet sind:
umount /media/005E-0549 Unmount failed: Cannot unmount because file system on device is busy
lsof /media/005E-0549/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2777 operating cwd DIR 8,97 16384 1 /media/005E-0549 ristretto 3168 operating cwd DIR 8,97 16384 1 /media/005E-0549
Zwei Prozesse greifen noch auf den Datenträger zu. Zum einen läuft eine Bash (die wäre unkritisch, was das Entfernen des Datenträgers angeht) und zum Andern ist „ristretto“ geöffnet, was hier der Bildbetrachter unter Ubuntu darstellt.
In der zweiten Spalte wird auch immer die betreffende PID angezeigt. Entsprechend kann man die blockierenden Dienste (wenn daraus kein Datenverlust resultieren kann) mit „kill“ beenden.
kill -s 9 2777
Oder um direkt alle betroffenen Dienste zu beenden (man sollte wissen was man tut):
kill -s 9 $(lsof -t /media/005E-0594)
Wobei hier die Option -t nur die PID’s ausgibt. So wird jede PID aus lsof dem Befehl kill übergeben, der dann den Prozess mit SIGKILL (Signal 9) beendet.
lsof zur Netzwerkanalyse
Bei der Überprüfung von Netzwerkdiensten kann lsof ebenfalls wertvolle Dienste leisten. Mit einem einfachen Befehl kann beispielsweise angezeigt werden, welche Verbindungen momentan auf dem Port 80 (Webserver) aktiv sind.
lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME /usr/sbin 3387 root 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 3868 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 3869 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 3871 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 3873 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 3874 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 4303 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 5289 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN) /usr/sbin 5600 www-data 5u IPv6 4058 0t0 TCP *:http (LISTEN)
Auf Port 80 scheint niemand verbunden zu sein. Alle Dienste sind im Modus (LISTEN), also am „lauschen“ und Warten auf Verbindungen.
lsof -i :443 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME /usr/sbin 3387 root 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 3868 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 3869 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 3869 www-data 18u IPv6 22012 0t0 TCP backuppc01.local:https->84.dclient.npn.ch:17088 (ESTABLISHED) /usr/sbin 3871 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 3873 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 3874 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 4303 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 5289 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN) /usr/sbin 5600 www-data 7u IPv6 4062 0t0 TCP *:https (LISTEN)
Auf Port 443 (https) lauscht ebenfalls der Apache Webserver. Hier gibt es jedoch bereits eine aktive Verbindung (ETABLISHED). Übrigens ist es normal, dass die erste Instanz von Apache jeweils als root gestartet wird. Dies hat mit den nötigen Rechten zum öffnen von priorisierten Ports zu tun.