Unterschied zwischen ulimit -n und / proc / $ PID / limit

9

Unter Linux gibt es ein offenes Dateilimit. Ich kann verwenden ulimit -n, um das Limit für offene Dateien anzuzeigen, das standardmäßig 1024 ist. Dann kann ich auch das pro-offene geöffnete Datei-Soft / Hard-Limit sehen, indem ich auf / proc / $ PID / limits schaue. Ich sehe weich = 1024 und hart = 4096.

Ich frage mich, was ist der Unterschied zwischen diesen beiden Ausgaben?

Auch tun setRlimit()und getRlimit()gilt systemweit oder pro - Prozess?

sdeLevelNegativeTwo
quelle

Antworten:

11

ulimit -nLegt standardmäßig das Soft-Limit fest. Sie können die -HOption zum Anzeigen / Festlegen des Hard-Limits hinzufügen .

Zum größten Teil verhalten sich weiche und harte Grenzen so:

  1. Die Prozesse von root (eigentlich jeder Prozess mit CAP_SYS_RESOURCE) können jede Grenze für jeden Prozess erhöhen oder senken.
  2. Die Prozesse eines Benutzers können die Begrenzung anderer Prozesse, die diesem Benutzer gehören, senken.
  3. Die Prozesse eines Benutzers können das Soft-Limit auf das Hard-Limit für Prozesse erhöhen, die diesem Benutzer gehören.
  4. Wenn ein Prozess versucht, sein Soft-Limit zu überschreiten, schlägt der Versuch fehl.

Harte Limits fungieren also als Obergrenze für weiche Limits (mit Ausnahme von Root, der wie gewohnt alles kann).

Es gibt eine Ausnahme: Ein Soft-CPU-Limit sendet ein SIGXCPUSignal. Ein Prozess kann dies ignorieren oder Zeit für die Bereinigung usw. aufwenden. Sobald das harte CPU-Limit überschritten ist, sendet der Kernel SIGKILL- was nicht abfangbar, handhabbar oder ignorierbar ist. In diesem Fall fungiert das Soft-Limit als Warnung: "Sie haben keine CPU-Zeit mehr - beenden Sie das Programm und beenden Sie es umgehend, oder sonst!" und die harte Grenze ist das "oder sonst".

Die meisten sind pro Prozess, aber einige (wie RLIMIT_NPROC) sind pro Benutzer. Die Handbuchseite getrlimit (2) gibt für jedes Limit an.

derobert
quelle
Eine andere verwandte Frage, warum meine Shell manchmal ulimit -n = 1024 hat und ein anderer Prozess, der von dieser Shell ausgelöst wird, ein weiches Limit = 4096 hat (Lesen von / proc / PID /
limit
@sdeLevelNegativeTwo Haben Sie den Prozess vor oder nach dem ausgelöst ulimit -n? Es betrifft nicht bereits ausgelöste Prozesse, sondern nur die Shell und zukünftige. Davon abgesehen erhöht der Prozess möglicherweise seine weiche Grenze auf die harte Grenze. Sie könnten es also verwenden ulimit -H -n, um es zu stoppen.
Derobert