
Configurei a VM de teste para testar o efeito das bombas fork. Então editei o limits.conf
seguinte para root
o 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:
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