Por que ulimit não funciona quando executado com sudo?

9

Bem..

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

Por que ulimitme desrespeita de uma maneira tão bárbara?

ntl0ve
fonte
11
Você teria o mesmo problema cd.
David Schwartz
Relacionado: sudo não pode dar o comando ulimit?
Kenorb 29/07

Respostas:

10

ulimité específico do shell / processo. Pule o sudo.

$ ulimit -s
8192
$ ulimit -s 16384
$ ulimit -s
16384
Daniel Beck
fonte
Estou surpreso sudopor não ter cometido um erro ao passar ulimit; geralmente ele precisa de um binário externo, mas ulimité um shell embutido.
Amphetamachine
@amphetamachine Confira which ulimit. Nada de surpreendente nisso.
Daniel Beck
Essa resposta é terrivelmente enganosa e inútil, mesmo que baseada em um grão de verdade.
precisa saber é o seguinte
3

A resposta de Daniel Beck não diz toda a verdade (na verdade, é meio que útil), e não ajuda as pessoas que realmente precisam "sudo ulimit".

O problema é que

  • ulimit tem limites flexíveis e rígidos
  • Depois de definir o limite rígido, você precisa ser superusuário para ajustá-lo novamente
  • sudo inicia um novo shell; quando você sai, volta ao seu antigo limite!

Explicação detalhada

O exemplo de Daniel só funciona em uma situação muito específica (que felizmente é a padrão).

Contraexemplo:

$ 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

Então, você define o limite com ulimit -s, e isso foi e define os limites suave e rígido. Agora você está impedido de configurá-lo mais alto.
Nesse ponto, você pode pensar em tentar sudo; mas não vai funcionar, por causa do que Daniel escreveu.

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

O que aconteceu aqui é que sudoiniciou um novo shell, onde foi executado ulimit; e nessa concha, o novo ulimit foi definido. Mas então esse shell terminou seu trabalho, foi demolido e agora você está de volta ao seu shell anterior com seu ulimit anterior.

Prova:

$ 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
$

Então, por que exatamente o exemplo de Daniel funcionou? Por causa dos limites rígidos e flexíveis padrão do ulimit, ele poderia empurrar o limite flexível para o rígido. Podemos fazer isso em câmera lenta para mostrar o truque:

$ 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
$

Em resumo: se você definir seu limite rígido e quiser aumentar, você não terá sorte nesse shell , ... a menos que permaneça como superusuário ou use algum encantamento para eliminar privilégios posteriormente.

hmijail
fonte