Warum funktioniert ulimit -n nicht, wenn es innerhalb eines Skripts aufgerufen wird?

873
John Miller

Das ist sehr seltsam. Ich versuche, das zu setzen, ulimitum 60000über meine startup.sh:

#!/bin/bash  ulimit -n 60000 echo "Hello! File Descriptor set" 

Ich kann dies mit ./startup.sh(755 Dateiberechtigungen) ausführen und die Echozeile wird gedruckt, und es werden keine Fehler angezeigt. Aber wenn ich ulimit -nes immer noch mache 1024, was ist los?

Was ich auch faszinierend finde, ist, dass ich ulimit -n 60000das Terminal eintippen kann und dann tun kann, ulimit -nund es funktioniert perfekt. Warum kann ich die Dateibeschreibungsgrenze nicht über ein Skript festlegen?

Debian 8, 64-Bit. OpenVZ-Container

3

1 Antwort auf die Frage

3
grawity

ulimits sind pro Prozess, nicht pro Benutzer oder pro System.

Der ulimitBefehl ist in die Shell integriert und bleibt daher im selben Prozess. Das angepasste Limit wirkt sich jedoch nur auf diesen Prozess aus und auf alles, was Sie von ihm ausführen (untergeordnete Prozesse erben dieselben Limits).

Allerdings ./startup.shläuft als separaten Prozess - also erfolgreich stellt es seine eigenen Grenzen, aber diese nicht auf magische Weise nach oben, um seine Eltern zu verbreiten.

(Dies ist die gleiche Situation wie beim cdoder beim Exportieren - obwohl Sie diese in einem Skript verwenden können, ändern sie alle Parameter des eigenen Prozesses des Skripts, nicht des gesamten Systems, und werden vergessen, sobald der Skriptprozess beendet ist.)

Hinweis: Es gibt einen weiteren Befehl, prlimitmit dem Sie die Ressourcengrenzwerte eines anderen Prozesses (durch PID angegeben) anpassen können. Ein Skript kann das Dateilimit seines übergeordneten Prozesses folgendermaßen ändern:

prlimit --pid=$PPID --nofile=4096 
Toll, danke für die ausführliche Erklärung. Behalten, dass es sich um ein globales Umfeld oder so handelt. John Miller vor 6 Jahren 0
@John Normalerweise ist das, was einer globalen Einstellung am nächsten kommt, `/ proc / sys / fs / file-max '. Da Sie sich in einem Container befinden, wendet OpenVZ möglicherweise auch verschiedene Grenzwerte an, die in `/ proc / user_beancounters` angegeben sind. grawity vor 6 Jahren 0
Das ist eine perfekte Erklärung, danke! Ravi vor 5 Jahren 0