Evite que a fork fork esgote o limite do processo com um limite de processo razoável por usuário usando ulimit .
Dessa forma, um único usuário esgotará sua cota de processo muito antes de o limite do sistema ser atingido.
$ ls
bash: no more processes
Uh oh. Parece que alguém fez uma bomba garfo. Onde eu costumava trabalhar, isso significava que o servidor compartilhado precisaria ser desligado, já que até mesmo os administradores de sistema com root muitas vezes não conseguiam resolver o problema. Muitas vezes, eles não conseguiam nem um aviso.
Eu ouvi alguns truques (principalmente enviar sinais STOP ao invés de KILL, já que o último permitiria que os tópicos restantes substituíssem os mortos), mas eu nunca vi um guia completo intitulado Então, você tem uma bomba de garfo?
Vamos fazer um.
Evite que a fork fork esgote o limite do processo com um limite de processo razoável por usuário usando ulimit .
Dessa forma, um único usuário esgotará sua cota de processo muito antes de o limite do sistema ser atingido.
A primeira coisa a tentar seria obter os usuários que efetuaram login para efetuar logout. É possível que o shell deles seja o processo pai do processo, fazendo todas as bifurcações e isso pode acabar com o problema.
Se isso não funcionar, você pode tentar executar kill -STOP -2
como root para congelar todos os processos em execução como qualquer usuário diferente de root. Se isso funcionar, você poderá usar kill -CONT <pid>
para descongelar alguns processos conhecidos não relacionados à bifurcação e eliminá-los para eliminar o problema da tabela de processos completa e dar-lhe algum espaço para rastrear e eliminar a fonte original do problema . O Sendmail seria um bom exemplo de um processo do sistema para matar, pois seria fácil identificá-lo usando o arquivo .pid para identificar o pid. Por exemplo, kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid)
.
Não tenho certeza de como você poderia enviar um sinal STOP, já que gerar kill
exigiria um identificador de processo disponível. Além disso, na minha experiência, os sistemas ficam sobrecarregados e inutilizáveis muito antes de ficarem sem processos.
Você considerou simplesmente impor limites de processo por usuário com ulimit
? Isso impediria que seus usuários iniciassem garfos (acidentalmente ou não).
Alguns sistemas BSD têm a capacidade de reservar os últimos 5 ou mais processos para raiz. Talvez o seu sistema tenha essa capacidade.