So stoppen Sie Fork Bomb aus Speicherfehler - RHEL 6

7

Ich habe eine Test-VM eingerichtet, um die Wirkung von Gabelbomben zu testen. Also habe ich limits.conffolgendes für den rootBenutzer bearbeitet :

root    hard         nproc  512

Jetzt lasse ich eine Gabelbombe so fallen:

:(){ :|:& };:

Nach einer Weile (von der ich glaube, dass es dauert, bis die Grenze von 512 erreicht ist) wird der folgende Fehler angezeigt: Beispiel

Dies geht weiter, ohne anzuhalten. Gibt es überhaupt eine Möglichkeit, dies zu stoppen, ohne den Computer neu zu starten?

rahuL
quelle
Haben Sie Zugriff auf eine Shell?
Gilles 'SO - hör auf böse zu sein'

Antworten:

3

Gibt es überhaupt eine Möglichkeit, dies zu stoppen, ohne den Computer neu zu starten?

Es ist nicht ganz unmöglich, und Sie können es durch Glück tun - dh Sie schaffen es, alle Prozesse zu beenden, bevor ein anderer erzeugt wird. 1 Aber du musst sehr, sehr viel Glück haben, also ist es keine verlässliche oder lohnende Anstrengung [vielleicht hat slm hier mehr Glück als ich, lol - TBH, ich habe mich nicht so sehr bemüht] . Wenn Sie mit Prioritäten herumspielen, könnten sich Ihre Chancen verbessern (siehe man nice), obwohl ich vermute, dass dies auch die Wirksamkeit der Gabelbombe beeinträchtigt.

Eine bessere Idee könnte sein, eine zu verwenden, die eine Zeitüberschreitung aufweist. Ein Beispiel in C finden Sie in Fußnote 5 zu meiner Antwort hier . 2 Sie können dasselbe mit einem Shell-Skript tun, wenn auch nicht so kurz wie :(){ :|:& };::

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

Führen Sie dies mit einem Argument aus, einige Sekunden. Alle Gabeln sterben nach dieser Zeit.

1 Tatsächlich kann es letztendlich von alleine passieren, wenn der Kernel-OOM-Killer Glück hat. Aber halten Sie nicht den Atem an.

2 Die dort verwendete Methode, um diese bestimmte Bombe (durch Setzen vm.overcommit_memory=2) zu behindern, funktioniert mit ziemlicher Sicherheit im Allgemeinen nicht, aber Sie könnten es versuchen. Ich bin es nicht, da ich mein System vorerst laufen lassen möchte;)

Goldlöckchen
quelle
Ich denke, Sie könnten dies vereinfachen, indem Sie stattdessen Schlaf verwenden. Könnte sein?
slm
@slm Das Beste, was Sie mit einem normalen Kernel in Bezug auf die Schlafgranularität tun können, ist 10 ms, und das ist zu lang - es wäre eher ein sprudelnder Gabelkuchen als eine Gabelbombe.
Goldlöckchen
3

Während der Entwicklung der Antwort auf diese Frage mit dem Titel: Wo ist die Gabel () auf der Gabelbombe: () {: |: &};:?Ich habe eine so genannte Sicherungsbombe mit verzögerter Gabel zusammengestellt, die leichter zu töten war.

Während ich diese Antwort entwickelte, konnte ich außerdem regelmäßig eine Gabelbombe stoppen, indem ich alle Prozesse abbrach. Es war einfacher und wiederholbarer als ich erwartet hätte.

Verwendete Methoden

Es ist schon eine Weile her, dass ich diese Antwort geschrieben habe, daher bin ich mir jetzt nicht 100% sicher, aber ich glaube, ich habe diese Methode angewendet:

$ pkill -f :

Es würde ein bisschen stehen bleiben und auf einen Prozess warten, aber schließlich konnte es laufen. Außerdem würde ich die übergeordnete Prozess-ID vor dem Starten der Gabelbombe notieren und dies auch tun:

$ pkill -P <PPID>

Dies ist die übergeordnete Prozess-ID (PPID), von der aus die Gabelbombe ausgeführt wurde. Diese Methode würde alle untergeordneten Prozesse ausschalten, was dazu führen würde, dass sie alle kaskadieren und sterben.

slm
quelle
+1 wenn Sie einen Hinweis geben, wie Sie alle Prozesse optimal
beenden
@goldilocks - siehe Updates.
slm
:) Wenn Sie die Gabel in ein Skript einfügen, das sich beim Namen nennt, können Sie auch so etwas tun while ((1)); do killall myscript.sh; done .
Goldlöckchen
@ Goldlöckchen - gute Idee.
slm
2

Ich glaube, Sie könnten das tun, was in der Antwort von hier vorgeschlagen wird, vorausgesetzt, Sie haben Zugriff auf Shell.

killall -STOP -u user1
killall -KILL -u user1
Ramesh
quelle