Beschränkt "ulimit -u" die Anzahl der Benutzerprozesse, die in interaktiven Login-Subshells und darin erstellten tmux-Sitzungen erstellt werden?

2187
Sam

Vor einigen Monaten habe ich eine Reihe von Bash-Skripts geschrieben, in denen Tmux zum Erstellen einer einfachen IDE auf einem AIX 7.1-Server verwendet wurde. In einem meiner Skripte ist ein Fehler, der manchmal Benutzerprozesse sehr schnell bis zu dem von ulimit festgelegten Grenzwert erzeugt. Dies geschieht sehr selten (etwa einmal pro Monat), und ich habe bereits mehrere erfolglose Stunden damit verbracht, diesen Fehler aufzuspüren. Daher entschied ich, dass ich mein Soft-User-Prozesslimit vorerst auf etwas niedriger als das harte Limit setzen kann ( B. 100 statt 1024), so dass, wenn sich mein Fehler erneut zeigt, keine spürbaren Auswirkungen auf die Leistung anderer Benutzer auf dem Server auftreten. Leider scheint "ulimit -Su 100" in bash unter AIX 7.1 nicht zu funktionieren, aber es funktioniert in ksh. Ich habe die folgende Problemumgehung durchgeführt:

Hat ksh zur Standardshell gemacht:

$ chsh [username] /usr/bin/ksh 

Schreibte folgendes an ~ / .kshrc:

ulimit -Su 100 # works in ksh, but not in bash /bin/bash -il # start bash as an interactive login shell exit # once bash exits, exit from ksh, too 

Jedes Mal, wenn ich eine Shell erstelle, setzt ksh das Limit für den Soft User-Prozess und startet bash als interaktive Login-Shell (ich möchte immer noch ~ / .bash_profile als Quelle erhalten). Nun muss ich mich fragen, ob die in ksh festgelegten Benutzerprozessgrenzwerte in bash-Subshells noch durchgesetzt werden. In der Bash-Subshell der obersten Ebene habe ich Folgendes ausgeführt:

$ ulimit -Sa core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max memory size (kbytes, -m) unlimited open files (-n) unlimited pipe size (512 bytes, -p) 64 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited 

Wie Sie sehen können, ist das Benutzerprozesslimit auf 1024 festgelegt.

Ein weiteres wichtiges Anliegen von mir ist zu wissen, ob das in ksh festgelegte Limit Prozesse einschließt, die in tmux-Sitzungen in Bash-Subshells erstellt werden.

Anderes Detail: Wenn ich in tmux ein neues Fenster erstelle, bin ich ziemlich sicher, dass ksh aufgerufen wird, ~ / .kshrc als Quelle verwendet wird und bash wie üblich gestartet wird. Ich glaube, dass dies der Fall ist, weil der Titel jedes neu erstellten Tmux-Bereichs "ksh" ist (der Standardtitel eines Tmux-Bereichs ist der Name des aktuellen Prozesses im Vordergrund), jedoch wird eine Bash-Eingabeaufforderung anstelle von angezeigt ksh-Eingabeaufforderung.

Dies ist ein bisschen zu weit gegangen, also werde ich weitere Details auslassen, wenn nicht danach gefragt wird.

Edit 1: Seltsames Verhalten

Schauen Sie sich an, was passiert, wenn ich versuche, mit "ulimit -Su" (keine Argumente) das Benutzerprozesslimit zu erhalten, mit und ohne Verwendung von Traversen:

$ truss ulimit -Su 2>| truss.out 100 $ ulimit -Su 1024 

Vielleicht benutze ich das Tool falsch, aber das sieht einfach komisch aus. Diese Befehle wurden in tmux ausgeführt.

Edit 2: Zusätzliche Informationen

Diese Befehle wurden über eine normale Bash-Eingabeaufforderung ausgeführt - keine Subshells oder Tmux.

$ truss ksh -c "ulimit -Su 100" 2>&1 | grep limit getrlimit64(9, 0x2FF1B988) = 0 setrlimit64(9, 0x2FF1B988) = 0 $ truss bash -c "ulimit -Su 100" 2>&1 | grep limit appulimit(1005, 0) = 0x2001C000 bash: line 0: ulimit: max user processes: cannot modify limit: A system call received a parameter that is not valid. 
4
Die Grenzen von 'ulimit' werden normalerweise vom Kernel gehandhabt, so dass es scheint, dass 'ulimit -u' mit verschiedenen tatsächlichen Kernel-Grenzwerten in `ksh` vs.` bash` arbeitet. Könnten Sie [`setrlimit ()`] (http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/getrlimit_64 überprüfen. htm) ruft in beiden Fällen [truss] auf (http://www.ibm.com/developerworks/aix/tutorials/au-apptracing/section3.html)? pabouk vor 10 Jahren 0
Ich habe Ihren Vorschlag angenommen und habe nun vier verschiedene Protokolle für das Ausführen von 'truss -u libc.a :: setrlimit ulimit -Su 100 2> | truss.out` aus verschiedenen Shell-Umgebungen (bash, ksh, bash tmux und ksh tmux). Welche spezifischen Informationen sollte ich posten? Jede Datei ist ungefähr 150 Zeilen lang und ich weiß nicht, wonach ich suchen soll. Sam vor 10 Jahren 0
Hat "Truss" wirklich etwas getan? "ulimit" sollte keine ausführbare Datei sein (es ist eine integrierte Shell), daher sollte "truss ulimit" fehlschlagen. Was schreibt "welcher ulimit"? --- Stattdessen sollten Sie Folgendes ausführen: `truss ksh -c" ulimit -Su 100 "` und dasselbe für `bash`. Zuverlässiger könnte der Syscall anstelle des [Bibliotheksaufrufs] abgefangen werden (http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/ basetrf1 / getrlimit_64.htm) (`-u`). Ich würde `truss ... 2> & 1 | versuchen grep limit` zuerst. pabouk vor 10 Jahren 0
Ich bin kein Fan von "which" aus verschiedenen Gründen, einschließlich derer, die [hier] diskutiert werden (http://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a -bash-script), aber "which truss" gibt "/ usr / bin / ulimit" an. "Type ulimit" dagegen gibt "ulimit is a shell builtin" an. Das Ersetzen von "ulimit" durch "env ulimit" im "truss" -Befehl funktioniert zwar, liefert jedoch eine etwas andere Ausgabe. Ich werde meine Frage mit den Ergebnissen Ihrer zusätzlichen vorgeschlagenen Maßnahmen bearbeiten. Sam vor 10 Jahren 0

1 Antwort auf die Frage

3
pabouk

Einführung in Ressourcengrenzen

Ressourcengrenzen in Unix-artigen Systemen werden durch kontrollierte getrlimit()und setrlimit()Systemaufrufe. Diese Grenzwerte werden pro Prozess konfiguriert und werden vererbt, wenn ein neuer Prozess erzeugt wird (z fork(). B. durch ). Das heißt, wenn Sie einen Grenzwert von einer Shell aus festlegen möchten, muss der Befehl in die Shell integriert sein (nicht als untergeordneter Prozess ausgeführt). Wirklich ulimitist ein Einbau in viele Muscheln inklusive kshund bash.

Das beobachtete Verhalten

Die "eingebaute" Natur ulimiterklärt das unterschiedliche Verhalten in kshund bash.

Das Limit für die Anzahl der Benutzerprozesse ( ulimit -u) wird von setrlimit(RLIMIT_NPROC, ...)syscall festgelegt. In alten AIX-Versionen wurde RLIMIT_NPROC nicht unterstützt. <1> Die Unterstützung wurde in AIX 6.1 hinzugefügt. <2 Abschnitt 5.4.4 Implementierte Änderungen>, so dass die ulimitIn- Versionen korrekt kshverwendet setrlimit64()werden. Die bashVersion wurde wahrscheinlich so kompiliert, dass sie mit der älteren AIX-Version kompatibel ist, und kann dieses Limit nicht steuern.

Fazit

Sie können das ulimiteingebaute Programm verwenden, kshund alle untergeordneten Prozesse übernehmen die konfigurierten Grenzwerte. Die Shells und Prozesse haben im Allgemeinen nichts mit dem Erzwingen und Einhalten der Ressourcengrenzen zu tun, sofern sie nicht explizit aufgerufen werden setrlimit().

Alternative

In AIX gibt es auch eine Alternative, die auch in älteren AIX-Versionen funktionieren sollte:

chdev -l sys0 -a maxuproc=100 

Siehe: 3, 4

Danke für die Erklärung! Sobald ich ein wenig mehr Ansehen auf dieser Seite erlangt habe, werde ich dieser Antwort sicher die verdiente Bestätigung geben :) Sam vor 10 Jahren 0