prlimit falha; 20 processos não são suficientes para bash?

5

Eu corro o seguinte comando em um bash recém-iniciado (sem nenhum processo filho anterior)

$ prlimit --pid $BASHPID --nproc=20:

que me dá uma avalanche de

bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable

Eu me pergunto é 20 para baixo um número, ou o procedimento está errado? O que está acontecendo aqui?

Eu sei que o bash tem uma chamada interna ulimit integrada, mas por que não prlimit work

atualizar #

também o bash embutido ulimit produz o mesmo resultado

$ ulimit -Su 20
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
bash: wait_for: No record of process 7527
bash: fork: retry: No child processes
bash: fork: retry: No child processes

Uma resposta a esta pergunta pode estar relacionada a como o ulimit RLIMIT_NPROC deve ser entendido. Parece ser tanto o UID como o PID?

Talvez alguém também possa dar uma ideia do que distingue as duas diferentes mensagens de erro No child processes e Resource temporarily unavailable

    
por humanityANDpeace 13.08.2016 / 15:40

2 respostas

6

Você entendeu mal como funciona o limite do processo. prlimit --nproc a.k.a. RLIMIT_NPROC a.k.a. ulimit -u é o número máximo de processos¹ para o usuário como um todo. Se você já tiver 20 processos em execução e definir o limite como 20, não será possível criar nenhum novo processo. O que importa é quantos processos estão sendo executados como usuário, não importa quem é seu pai ou qual é sua configuração de limite.

A sutileza é que, embora o limite seja global, ele se aplica apenas aos processos em que está definido. Portanto, se você tiver 18 processos em execução e executar prlimit --nproc 20 bash em um terminal e prlimit --nproc 30 bash em outro terminal, o primeiro bash não poderá criar nenhum subprocesso, mas o segundo poderá criar um pouco mais, até que haja um total de 30 ( se eles foram iniciados a partir dessa festança ou não).

Se você definir o limite como 1 para um processo, então esse processo não pode ser bifurcado, mas outros processos ainda podem ser bifurcados. Se você definir o limite para um número em seus scripts de login, esse número se aplicará a seus processos (exceto aqueles iniciados sem ler seus scripts de login, por exemplo, de um trabalho agendado). Outros casos podem ficar confusos.

É mais fácil descrever isso do ponto de vista da implementação. O limite é lido apenas ao executar a chamada do sistema fork . Quando um processo chama fork , o kernel conta o número R dos processos que estão sendo executados como o mesmo usuário. Se o limite de NPROC do processo de chamada for menor ou igual a R , a chamada será rejeitada com o erro EAGAIN (“recurso temporariamente indisponível”, por exemplo, “tente novamente”).

No seu caso, você provavelmente já tem pelo menos 20 processos em execução, e seu .bashrc executa vários subprocessos (ou melhor, não os executa porque o limite do processo foi atingido).

Você vê duas mensagens diferentes porque o bash tenta bifurcar várias vezes quando o erro é EAGAIN . Nas primeiras vezes, ele exibe uma mensagem para dizer que está tentando novamente e, finalmente, exibe uma mensagem dizendo que desistiu.

¹ Mais precisamente, os encadeamentos do kernel.
² Esta chamada de sistema é chamada clone no Linux.

    
por 13.08.2016 / 23:21
1

A linha de fundo tem sido que -nproc define o limite para itens executáveis (que são threads e processos e devido ao meu material .bashrc inchado, existem mais de 20 threads necessários, pelo menos essa é a minha suposição desde

depois de iniciar um novo bash como este

$ bash --noprofile --norc

isso foi possível

bash-4.3$ ulimit -Su 1
bash-4.3$ echo 1
1
bash-4.3# echo 1 &
bash: fork: retry: No child processes

é que um segmento foi suficiente, uau!

    
por 13.08.2016 / 15:54

Tags