Dlaczego ulimit nie działa po uruchomieniu sudo?

9

Dobrze..

$ ulimit -s
8192
$ sudo ulimit -s 16384
$ ulimit -s
8192

Dlaczego nie ulimitszanuje mnie w tak barbarzyński sposób?

ntl0ve
źródło
1
Miałbyś ten sam problem z cd.
David Schwartz

Odpowiedzi:

10

ulimitjest specyficzny dla powłoki / procesu. Pomiń sudo.

$ ulimit -s
8192
$ ulimit -s 16384
$ ulimit -s
16384
Daniel Beck
źródło
Jestem zaskoczony, sudoże nie dał błędu, gdy został zaliczony ulimit; zwykle potrzebuje zewnętrznego pliku binarnego, ale ulimitjest wbudowaną powłoką.
amfetamachina
@amphetamachine Sprawdź which ulimit. Nic w tym dziwnego.
Daniel Beck
Ta odpowiedź jest strasznie myląca i nieprzydatna, nawet jeśli opiera się na ziarnku prawdy.
Hmijail opłakuje powrót
3

Odpowiedź Daniela Becka nie mówi całej prawdy (w rzeczywistości jest to sztuczka zręczna) i nie pomaga ludziom, którzy muszą robić „sudo ulimit”.

Problemem jest

  • ulimit ma miękkie i twarde ograniczenia
  • po ustawieniu twardego limitu musisz być superużytkownikiem, aby ustawić go z powrotem na wyższym poziomie
  • sudo uruchamia nową powłokę; kiedy z niego wyjdziesz, wrócisz do swojej starej ulimit!

Szczegółowe wyjaśnienie

Przykład Daniela działa tylko w bardzo specyficznej sytuacji (która na szczęście jest domyślna).

Przeciwprzykład:

$ ulimit -s 8191              # set both hard and soft limits
$ ulimit -s                   # show current soft limit
8191
$ ulimit -s 16384             # set both hard and soft limits
-bash: ulimit: stack size: cannot modify limit: Operation not permitted

Więc ustawiasz limit za pomocą ulimit -s, i to poszło i ustawiasz zarówno miękkie, jak i twarde ograniczenia. Teraz nie możesz ustawić go wyżej.
W tym momencie możesz spróbować sudo; ale to nie zadziała z powodu tego, co napisał Daniel.

$ sudo ulimit -s 16384        # maybe with sudo?
$ ulimit -s
8191
$

Stało się tutaj to, że sudouruchomiono nową powłokę, w której działała ulimit; i w tej powłoce ustawiono nowy ulimit. Ale potem ta skorupa zakończyła pracę, została zburzona, a teraz wróciłeś do poprzedniej powłoki z poprzednią ulimit.

Dowód:

$ ulimit -s 8191
$ ulimit -s
8191
$ sudo bash
# ulimit -s
8191
# ulimit -s 16384
# ulimit -s                           # It worked!
16384
# exit
exit
$ ulimit -s                           # ... but now we're back to the old ulimit.
8191
$

Dlaczego więc dokładnie działał przykład Daniela? Z powodu domyślnych twardych i miękkich limitów ulimita mógł przesunąć miękki limit na twardy. Możemy to zrobić w zwolnionym tempie, aby pokazać sztuczkę:

$ ulimit -Ss                 # show the Soft limit
8192
$ ulimit -Hs                 # show the Hard limit
65532
$ ulimit -s                  # by default, shows the Soft limit
8192
$ ulimit -s 16384            # set both the Soft and Hard limit
$ ulimit -s                  # shows the Soft limit
16384
$ ulimit -Hs                 # but, gotcha! the Hard limit has also been set
16384
$ ulimit -s 16385            # so now we can't go higher
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
$

Podsumowując: jeśli ustawisz swój twardy limit i chcesz go podnieść, nie masz szczęścia w tej powłoce , ... chyba że pozostaniesz superużytkownikiem lub użyjesz zaklęcia, aby później upuścić uprawnienia.

Hmijail opłakuje odejście
źródło