Qual é a melhor maneira de limpar depois de uma bomba de garfo?

18
$ 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.

    
por raldi 08.10.2008 / 00:19

4 respostas

8

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.

    
por 18.10.2008 / 20:15
4

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) .

    
por 08.10.2008 / 05:29
3

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).

    
por 08.10.2008 / 00:24
2

Alguns sistemas BSD têm a capacidade de reservar os últimos 5 ou mais processos para raiz. Talvez o seu sistema tenha essa capacidade.

    
por 18.10.2008 / 20:03