Como impedir que o Fork Bomb fique sem memória - RHEL 6

7

Eu configurei a VM de teste para testar o efeito das bombas de garfo. Então eu editei o limits.conf como segue para root user:

root    hard         nproc  512

Agora deixo cair uma garfo assim:

:(){ :|:& };:

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

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

    
por rahuL 12.10.2013 / 19:21

3 respostas

3

Is there anyway to stop this without rebooting the machine?

Não é totalmente impossível, e você pode fazê-lo através da sorte - ou seja, você consegue matar todos os processos antes que outro seja gerado. 1 Mas você tem que ter muita sorte, então não é um esforço confiável ou que valha a pena [talvez slm tenha mais sorte do que eu aqui, lol - TBH eu não tentei tanto] . Se você jogar com as prioridades, suas chances podem melhorar (veja man nice ), embora eu suspeite que isso também vai mexer com a eficácia da bomba garfo.

Uma ideia melhor pode ser usar um que expira. Para um exemplo em C, consulte a nota de rodapé número 5 para minha 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, um número de segundos. Todos os garfos morrerão depois disso.

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

2 O método usado para diminuir essa bomba em particular (configurando vm.overcommit_memory=2 ) quase certamente não funcionará em geral, mas você pode tentar. Eu não sou desde que eu gostaria de deixar meu sistema funcionando por enquanto;)

    
por 12.10.2013 / 19:34
3

Enquanto desenvolvia a resposta para essa pergunta, intitulada: Onde está o garfo () na bomba do garfo: () {: |: & };:? , eu coloquei o que eu chamei de um fusível atrasado garfo bomba, que era mais fácil de matar.

Além disso, enquanto desenvolvia essa resposta, eu regularmente conseguia deter uma bifurcação, matando todos os processos. Foi mais fácil e mais repetitivo do que eu esperava.

Métodos usados

Já faz um tempo desde que eu escrevi a resposta, então eu não tenho 100% de certeza agora, mas no topo da minha cabeça eu acho que eu estava usando esse método:

$ pkill -f :

Pararia um pouco à espera de um processo, mas acabou sendo executado. Também observaria o ID do processo pai antes de iniciar a fork fork e também faria isso:

$ pkill -P <PPID>

Esse é o ID do processo pai (PPID) de onde a bomba do fork foi executada. Esse método levaria todos os processos filhos para baixo, o que faria com que todos eles caíssem e morressem.

    
por 12.10.2013 / 20:00
2

Eu acredito que você poderia fazer como sugerido na resposta de aqui , supondo que você tenha acesso ao shell.

killall -STOP -u user1
killall -KILL -u user1
    
por 01.09.2014 / 17:19