Questão Como parar e detectar a bomba garfo


#include <stdlib.h>
#include <unistd.h>

int main()
{
   while(1)
      fork();
}

Este é o código para uma bomba bifurcada.

Em nosso colégio, nos conectamos via telnet, ou seja, o protocolo de atendimento ao cliente. Cerca de 100 sistemas estão conectados ao servidor. De repente, vimos o servidor ficar lento e, depois de algum tempo, ele caiu. Eu vim a saber que alguém implementou uma bomba de garfo.

Como podemos detectar em qual sistema a bomba do garfo é implementada? E como podemos parar isso?

Um método é limitar o número máximo de processos que um único usuário pode possuir. Existe algum método para pará-lo e saber de qual sistema ele foi implementado?


13


origem


Telnet? A sério? Você deveria realmente usar o SSH ... - ThiefMaster
Veja também Qual é a melhor maneira de limpar depois de uma bomba garfo?. - Petr Pudlák
Veja também unix.stackexchange.com/q/64611/17609 - moooeeeep
bem foi migrado de forma SO mas uma resposta poderia estar no nível do kernel. alguns remendos foram tentativamente feitos mas nenhum parece encontrar a aceitação. Meu ponto é: como detectá-lo: bem, qualquer um saberá que não pode mais usar o sistema, portanto, o ponto de detecção talvez não seja o ponto-chave. Como se recuperar? A resposta atual é reboot, eu declararia: uma maneira de dizer ao kernel para rodar apenas um processo (aquele que você quer limpar a bagunça) e parar todos os outros que eles são. Isso pode ser um recurso acessível apenas no console do sistema. - philippe lhardy


Respostas:


Uma maneira é limitar o número de processos que um usuário pode executar.

Basta fazer login como root e editar esse arquivo para adicionar usuários e configurar seu limite.

# vi /etc/security/limits.conf

Adicione esta linha ao arquivo

john hard nproc 10

Agora o usuário john pode criar apenas 10 processos.


16



Eu acho que você tem que reiniciar para ter as novas configurações em /etc/security/limits.conf surtir efeito. - Dan D.
Não. Mas eles são aplicados pelo PAM, portanto, eles só se aplicam a novos logins. - ThiefMaster


Para parar uma bomba de garfo que você pode ser capaz de usar killall <name> matar todos os processos da bomba. No entanto, uma vez que uma bomba bifurcada geralmente resulta em uma carga incrivelmente alta no sistema, você pode não ser capaz de executar SSH nela ou executá-la. Então, uma reinicialização pode ser necessária ou, pelo menos, muito mais rápida.

Se cada usuário tiver sua própria conta no sistema, basta verificar o diretório pessoal de todos e procurar o executável. As chances são boas, ele também enviou o código-fonte para encontrá-lo não deve ser muito difícil. Se foi uma conta compartilhada para todos os alunos, você está sem sorte. Especialmente após o término da sessão telnet ou ssh do usuário, você não tem chance de descobrir quem o iniciou.

No entanto, em vez de punir o usuário que detonou essa bomba, você deve corrigir a configuração do sistema para desarmar as garfo-bomba. Você pode definir limites de processo por usuário usando /etc/security/limits.conf e assim impedir que uma bomba bifurcada saia do controlo - com, e. apenas 50 processos de uma bifurcação não causam muito dano.


14



é impossível detectar de qual sistema está vindo aa? - Rajesh M
@ user1670364: Não está claro o que você está perguntando. O que você quer dizer com "sua vinda"? Você pode dizer qual usuário possui o processo, o que mais você quer saber? - David Schwartz
@ DavidSchwartz quero dizer que é possível detectar a bomba na qual o sistema está sendo implementado? - Rajesh M
@ user1670364: Se você está falando do sistema que está realmente executando a fork fork, é o que está lento. Se você quer dizer que o usuário é responsável, é o usuário que possui os processos que estão bifurcando. - David Schwartz