Cómo detener el error de falta de memoria de Fork Bomb - RHEL 6

Cómo detener el error de falta de memoria de Fork Bomb - RHEL 6

Configuré la máquina virtual de prueba para probar el efecto de las bombas de horquilla. Entonces edité lo limits.confsiguiente para rootel usuario:

root    hard         nproc  512

Ahora lanzo una bomba tenedor así:

:(){ :|:& };:

Después de esto, después de un tiempo (que creo que se necesita para alcanzar el límite de 512), aparece el siguiente error: ejemplo

Esto continúa sin parar. ¿Hay alguna forma de detener esto sin reiniciar la máquina?

Respuesta1

¿Hay alguna forma de detener esto sin reiniciar la máquina?

No es del todo imposible y puedes hacerlo mediante la suerte, es decir, logras eliminar todos los procesos antes de que se genere otro. 1 Pero hay que tener mucha, mucha suerte, por lo que no es un esfuerzo fiable ni que valga la pena.[Quizás slm tenga más suerte que yo aquí, jejeje. TBH, no lo he intentado tanto]. Si juegas con las prioridades, tus posibilidades podrían mejorar (ver man nice), aunque sospecho que esto también afectará la eficacia de la bomba tenedor.

Una mejor idea podría ser utilizar uno que se agote. Para ver un ejemplo en C, consulte la nota al pie número 5 demi respuesta aquí. 2 Puedes hacer lo mismo con un script de shell, aunque no sería tan corto como :(){ :|:& };::

#!/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           

Ejecútelo con un argumento, varios segundos. Todas las bifurcaciones morirán después de ese tiempo.

1 De hecho, eventualmente puede suceder por sí solo, si el asesino OOM del kernel tiene suerte. Pero no contengas la respiración.

2 Es casi seguro que el método utilizado allí para paralizar esa bomba en particular (colocando vm.overcommit_memory=2) no funcionará en general, pero podrías intentarlo. No lo hago porque me gustaría dejar mi sistema funcionando por ahora;)

Respuesta2

Mientras desarrollaba la respuesta a esta pregunta, titulada:¿Dónde está el fork() en la bomba fork :(){ :|: & };:?, Armé lo que llamé una bomba de horquilla retardada con mecha, que era más fácil de matar.

Además, mientras desarrollaba esa respuesta, regularmente pude detener una bomba de horquilla al eliminar todos los procesos. Fue más fácil y más repetible de lo que hubiera esperado.

Métodos utilizados

Ha pasado un tiempo desde que escribí esa respuesta, así que no estoy 100% seguro ahora, pero creo que estaba usando este método:

$ pkill -f :

Se detenía un momento esperando un proceso, pero finalmente podía ejecutarse. También anotaría el ID del proceso principal antes de iniciar la bomba de bifurcación y también haría esto:

$ pkill -P <PPID>

Ese es el ID del proceso principal (PPID) desde donde se ejecutó la bomba fork. Ese método desactivaría todos los procesos secundarios, lo que provocaría que todos cayeran en cascada y murieran.

Respuesta3

Creo que podrías hacer lo sugerido en la respuesta deaquísuponiendo que tenga acceso al shell.

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

información relacionada