ulimit: diferença entre limites rígidos e flexíveis

87

Qual é a diferença entre limites rígidos e flexíveis no ulimit?

Para o número de arquivos abertos, tenho um limite flexível de 1024 e um limite rígido de 10240. É possível executar programas que abrem mais de 1024 arquivos. Para que serve o limite flexível?

daniel kullmann
fonte
4
Você está falando ulimit -n? Tente executar um shell com um valor muito baixo ( bash -c 'ulimit -n 4; exec 3>a; exec 4>b; exec 5>c'). Qual é o resultado?
Gilles

Respostas:

77

Um limite rígido só pode ser aumentado pela raiz (qualquer processo pode reduzi-lo). Portanto, é útil para segurança: um processo não raiz não pode ultrapassar um limite rígido. Mas é inconveniente que um processo não raiz não possa ter um limite inferior ao de seus filhos.

Um limite flexível pode ser alterado pelo processo a qualquer momento. Portanto, é conveniente, desde que os processos cooperem, mas não é bom para segurança.

Um caso de uso típico para limites flexíveis é desativar dumps principais ( ulimit -Sc 0), mantendo a opção de ativá-los para um processo específico que você está depurando ( (ulimit -Sc unlimited; myprocess)).

O ulimitcomando shell é um invólucro em torno da setrlimitchamada do sistema, e é aí que você encontrará a documentação definitiva.

Observe que alguns sistemas podem não implementar todos os limites. Especificamente, alguns sistemas não suportam limites por processo nos descritores de arquivo (o Linux suporta); se o seu não, o comando shell pode ser um não-op.

Gilles
fonte
6
+1 para o caso de uso de limites flexíveis. O limite de tamanho do conjunto residente ( ulimit -m, RLIMIT_RSS) é um exemplo de limite que não é mais eficaz no Linux. O limite de memória virtual ( ulimit -v, RLIMIT_AS) funciona, no entanto.
Adam Zalcman
@Gilles, quer dizer, sem reiniciar o processo, quando alteramos o limite flexível, ele pode ser efetuado imediatamente?
21713 Ryan
1
@Ryan Sim, um programa pode alterar seu próprio limite flexível a qualquer momento chamando setrlimit(na extensão permitida pelo limite rígido, a menos que seja executado como raiz, é claro). A maioria dos programas não possui um comando que permita ao usuário fazer isso, mas você pode tentar se conectar ao programa com um depurador e emitir uma setrlimitchamada, ou no Linux, você pode chamar prlimit(pelo qual não conheço nenhum shell Utilitário).
Gilles
1
Agora também há um prlimitutilitário de shell.
telcoM 26/03
0

O limite rígido é para fins de segurança. Para um usuário não raiz, ele só pode diminuir o limite máximo do limite definido atualmente; ele não pode aumentá-lo. Aumentar o limite rígido pode ser feito apenas pelo usuário root (ou talvez com privilégio sudo, não tenho certeza disso). O que um usuário não raiz pode fazer é escolher um limite (chamado limite flexível) que pode estar no intervalo [0, limite fixo] para seus processos. É o limite flexível que é visto e levado em consideração pelos processos.

Ankit Shubham
fonte