$ :(){ :|:& };:. Was? Warum ist meine Shell gerade abgestürzt? Wie habe ich das geschafft?

Anscheinend habe ich eine Fork-Bombe ausgeführt. „Eine was?“, fragt man sich jetzt vielleicht. Informatiker lieben großartige Metaphern, und in diesem Fall habe ich tatsächlich etwas Explosives mit meinem PC gemacht.

Fork-Bomben

Was wie Kauderwelsch aussieht, ist eigentlich eine der einfachsten Funktionen Ihres Betriebssystems, die jedoch missbraucht wird, um Ihr Betriebssystem komplett lahmzulegen. :(){ :|:& };: ist nichts anderes als die Deklaration einer Funktion, gefolgt von ihrem Aufruf. Der Name der Funktion lautet :. Benennen wir sie in crash um, damit wir verstehen können, was hier passiert:

crash(){
  crash | crash&
}
crash

Die Funktion crash ruft sich eigentlich nur selbst auf, leitet (|) ihre eigene Ausgabe in einen weiteren Aufruf ihrer selbst weiter, der dann mit & im Hintergrund ausgeführt wird. Nach dieser Deklaration wird diese Funktion einmal aufgerufen.

Vielleicht hat man jetzt bereits erkannt, dass diese Funktion sich selbst zweimal aufruft und jeder dieser Aufrufe zu zwei weiteren Aufrufen führt und so weiter:

0 1 2 3 : : : : 8 4 9 2 1 0 5 1 1 1 1 2 6 1 3 3 1 4 7 1 5

Exponentielles Wachstum

Jede Generation der Fork-Bombe hat doppelt so viele Geschwister wie die vorherige Generation.

Unser Betriebssystem hat eine maximale Anzahl von Prozessen. Unter Linux kann man den folgenden Befehl verwenden, um die maximale Prozess-ID zu ermitteln:

# sysctl kernel.pid_max
kernel.pid_max = 4194304

Das sind genau 2^22 zulässige Prozesse (eine gigantische Menge!). Da unsere Fork-Bombe jedoch die Kraft des exponentiellen Wachstums nutzt, bedeutet dies auch, dass wir nach nur 22 Generationen die Grenze aller auf unserem System verfügbaren Prozess-IDs erreichen!

Erkenntnisse

Macht keine Forkbomben, Kinder! Sie sehen zwar lustig aus, aber euer PC wird euer Experiment wahrscheinlich nicht zu schätzen wissen und ihr müsst möglicherweise einen Neustart erzwingen (obwohl ich das aus Erfahrung niemals wissen würde).