Dlaczego ulimit -n nie działa po wywołaniu w skrypcie?

5

To bardzo dziwne. Próbuję ustawić ulimitsię 60000za pośrednictwem mojego startup.sh:

#!/bin/bash

ulimit -n 60000
echo "Hello! File Descriptor set"

Mogę to wykonać z ./startup.sh(uprawnieniami do pliku 755), linia echa jest drukowana i nie są wyświetlane żadne błędy. Jednak gdy to robię ulimit -n, nadal pokazuje 1024, co się dzieje?

Fascynuje mnie również to, że mogę pisać ulimit -n 60000w terminalu, a następnie robić ulimit -ni działa idealnie. Dlaczego nie mogę ustawić limitu deskryptora pliku za pomocą skryptu?

Debian 8, 64-bit. Pojemnik OpenVZ

John Miller
źródło

Odpowiedzi:

5

limity są określane dla poszczególnych procesów , a nie dla użytkownika ani dla systemu.

ulimitPolecenie jest wbudowany w powłoki, tak że pozostaje on w tym samym procesie; jednak skorygowany limit wpływa tylko na ten proces, a także na wszystko, co z niego uruchomisz (procesy potomne dziedziczą te same limity).

Jednak ./startup.shdziała jako osobnego procesu - dlatego też z powodzeniem dostosowuje swoje granice, ale to nie magiczny sposób propagować górę do jego rodzica.

(Jest to ta sama sytuacja, co w przypadku opcji cd„eksportuj” - mimo że można ich używać w skrypcie, wszystkie zmieniają parametry własnego procesu skryptu, a nie całego systemu, i zostaną zapomniane po zakończeniu procesu skryptu.)

Uwaga: Jest to kolejna komenda, prlimitktóra pozwala dostosować limity zasobów innego procesu (PID) określony przez,. Skrypt może zmienić limit plików swojego procesu nadrzędnego w następujący sposób:

prlimit --pid=$PPID --nofile=4096
grawitacja
źródło
Wspaniale, dziękuję za szczegółowe wyjaśnienie. Utrzymywałam, że to globalne otoczenie czy coś takiego.
John Miller,
@John Zwykle najbliższa byłaby sytuacja globalna /proc/sys/fs/file-max. Ponieważ jesteś w kontenerze, OpenVZ może również stosować różne limity widoczne w /proc/user_beancounters.
grawity