Como parar o erro de falta de memória do Fork Bomb - RHEL 6

Como parar o erro de falta de memória do Fork Bomb - RHEL 6

Configurei a VM de teste para testar o efeito das bombas fork. Então editei o limits.confseguinte para rooto usuário:

root    hard         nproc  512

Agora eu solto uma bomba de garfo assim:

:(){ :|:& };:

Depois disso, depois de um tempo (que acredito ser necessário para atingir o limite de 512), aparece o seguinte erro: exemplo

Isso continua sem parar. Existe alguma maneira de parar isso sem reiniciar a máquina?

Responder1

Existe alguma maneira de parar isso sem reiniciar a máquina?

Não é totalmente impossível, e você pode fazer isso com sorte - ou seja, você consegue matar todos os processos antes que outro seja gerado. 1 Mas você precisa ter muita sorte, então não é um esforço confiável ou que valha a pena[talvez o slm tenha mais sorte do que eu aqui, haha ​​- TBH, não tentei tanto]. Se você brincar com as prioridades, suas chances poderão melhorar (veja Recursos man nice), embora eu suspeite que isso também irá prejudicar a eficácia da bomba bifurcada.

Uma ideia melhor seria usar um que expire. Para um exemplo em C, veja a nota de rodapé número 5 paraminha resposta aqui. 2 Você pode fazer a mesma coisa com um script de shell, embora não seja tão curto quanto :(){ :|:& };::

#!/bin/bash

export fbomb_duration=$1
export fbomb_start=$(date +%s)

go () {
    now=$(date +%s)
    if [[ $(($now-$fbomb_start)) -gt $fbomb_duration ]]
        then exit 0;
    fi
    go &
}

while ((1)); do
    go
done           

Execute isso com um argumento, alguns segundos. Todos os garfos morrerão após esse tempo.

1 Na verdade, isso pode acontecer por conta própria, eventualmente, se o assassino OOM do kernel tiver sorte. Mas não prenda a respiração.

2 O método usado para prejudicar aquela bomba em particular (definindo vm.overcommit_memory=2) quase certamente não funcionará em geral, mas você pode tentar. Não estou, pois gostaria de deixar meu sistema funcionando por enquanto;)

Responder2

Ao desenvolver a resposta para esta pergunta, intitulada:Onde está o fork() na bomba fork :(){ :|: & };:?, Montei o que chamei de bomba garfo com fusível retardado, que era mais fácil de matar.

Além disso, ao desenvolver essa resposta, consegui interromper regularmente uma bomba bifurcada, eliminando todos os processos. Foi mais fácil e repetível do que eu esperava.

Métodos usados

Já faz um tempo que escrevi essa resposta, então não tenho 100% de certeza agora, mas pensando bem, acho que estava usando este método:

$ pkill -f :

Ele pararia um pouco esperando por um processo, mas eventualmente conseguiu ser executado. Além disso, eu observaria o ID do processo pai antes de iniciar a bomba fork e faria isso também:

$ pkill -P <PPID>

Esse é o ID do processo pai (PPID) de onde a bomba fork foi executada. Esse método derrubaria todos os processos filhos, o que faria com que todos eles entrassem em cascata e morressem.

Responder3

Eu acredito que você poderia fazer como sugerido na resposta deaquisupondo que você tenha acesso ao shell.

killall -STOP -u user1
killall -KILL -u user1

informação relacionada