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.