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

9

Bem ..

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

Por que o ulimit me desrespeita de maneira tão bárbara?

    
por ntl0ve 02.03.2012 / 10:10

2 respostas

11

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

$ ulimit -s
8192
$ ulimit -s 16384
$ ulimit -s
16384
    
por 02.03.2012 / 10:20
2

A resposta de Daniel Beck não diz toda a verdade (na verdade, é uma espécie de truque) e não ajuda as pessoas que precisam realmente fazer "sudo ulimit".

O problema é que

  • o ulimit tem limites suaves e rígidos
  • depois de definir o limite rígido, você precisa ser superusuário para defini-lo novamente como
  • o sudo inicia um novo shell; quando você sair, você está de volta ao seu ulimit antigo!

Explicação detalhada

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

Contra-exemplo:

$ 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 ajusta os limites de hardware e disco rígido. Agora você está impedido de configurá-lo mais alto.
Neste ponto, você pode pensar em experimentar 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 sudo iniciou um novo shell, no qual correu ulimit ; e nesse shell, o novo ulimit foi definido. Mas então esse shell terminou seu trabalho, foi demolido e agora você está de volta ao shell anterior com o 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 hard e soft padrão do ulimit, ele poderia empurrar o limite suave para o hard. 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 máximo e quiser aumentá-lo, você está sem sorte nesse shell , ... a menos que você permaneça como superusuário ou use algum encantamento para soltar privilégios depois.

    
por 07.08.2017 / 12:23

Tags