GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Die versehentliche Forkbombe:Wie ein *nix-Skript schlecht wird

Einer meiner ersten Jobs in der Industrie war bei einem kleinen regionalen ISP. Damals waren 56k-Modems glänzend und neu. Wir hatten ein paar Dutzend PoPs (Points of Presence), an denen wir Bänke von Modems installierten und die Daten über eine Reihe von vollständigen und teilweisen T1-Leitungen an unsere Hauptniederlassung zurückgaben.

Wir stellten die typische Menge an Diensten zur Verfügung – E-Mail, Internetnachrichten und allgemeiner Internetzugang. Um diese Dienste anbieten zu können, brauchten wir natürlich eigene Server. Die Lösung bestand darin, einen Cluster von SCO-Unix-Systemen einzurichten. Ja, *das* SCO. Es ist schon eine ganze Weile her, aber ein Cluster-Setup wie dieses ist schwer zu vergessen. Die Server wurden so eingerichtet, dass sie Abhängigkeiten voneinander hatten. Wenn einer ausfiel, stürzte nicht alles ab, aber um diesen einen Server zu sichern, musste im Allgemeinen alles neu gestartet werden.

Das allgemeine Setup war, dass sich das NFS der Server beim Start gegenseitig einhängte. Dies verursacht natürlich eine Race-Condition während des Starts. Die Ingenieure hatten ein detailliertes Dokument geschrieben, in dem die Schritte erläutert wurden, die erforderlich sind, um den gesamten Cluster nach einem Ausfall wieder hochzufahren. Der gesamte Vorgang dauerte normalerweise 30-45 Minuten.

Zu dieser Zeit war ich ein einfaches Mitglied des technischen Supports und verbrachte den Großteil meiner Zeit damit, neue Kunden bei der Installation der Software zu unterstützen, die für den Online-Zugang erforderlich ist. Ich war relativ neu in der Welt von Unix und Hochgeschwindigkeitsnetzwerken und saugte so viel Wissen auf, wie ich konnte.

[ Das könnte Ihnen auch gefallen: Linux-Terminal-Highlights:Going beyond cowsay ]

Einer der Leute, mit denen ich zusammengearbeitet habe, Brett, hat mir viel beigebracht. Er schrieb das von uns verwendete Netzwerküberwachungssystem und teilte seine Zeit damit auf, das Netzwerk am Laufen zu halten. Er war manchmal auch ein bisschen ein Witzbold.

Am Ende eines ziemlich typischen Tages war ich zufällig im Unix-Cluster. Aus heiterem Himmel schlug meine Verbindung fehl und ich wurde wieder auf mein lokales Betriebssystem hochgefahren. Das war ein bisschen seltsam, aber es kam gelegentlich vor, also loggte ich mich einfach wieder ein. Innerhalb weniger Sekunden wurde ich wieder ausgebootet.

Ich fing an, ein bisschen zu debuggen und versuchte herauszufinden, was los war. Ich erinnere mich nicht an alles, was ich getan habe, aber ich erinnere mich, dass ich einige schnelle Skripte zusammengestellt habe, um mich anzumelden, verschiedene Prozesse zu überprüfen und herauszufinden, was passiert ist. Irgendwann stellte ich fest, dass ich von einem anderen Benutzer – Brett – vom System gebootet wurde.

Als ich herausfand, was los war, musste ich mich wehren. Also fing ich an, mit Shell-Skripten herumzuspielen und herauszufinden, wie ich die PID seiner Shell identifizieren konnte, damit ich ihn offline booten konnte. Das ging ein bisschen hin und her, jeder von uns eskalierte die Angriffe. Wir begannen, andere Dienste zu nutzen, um wieder Zugriff zu erlangen, Angriffe zu starten usw.

Schließlich startete ich das, was ich für den ULTIMATIVEN Angriff hielt. Ich schrieb ein kleines Shell-Skript, das nach seinem Login suchte, die Shell identifizierte und anschließend seinen Zugriff beendete. Ziemlich einfach, aber ich habe den ultimativen Twist hinzugefügt. Nachdem das Skript ausgeführt wurde, führte es eine Kopie von sich selbst aus. BOOM. Auf keinen Fall kann er jetzt wieder einsteigen.

Und es hat funktioniert! Brett verlor seinen Zugang und konnte in den nächsten fünf Minuten oder so einfach nicht Fuß fassen. Und natürlich hatte ich die Aufgabe in den Hintergrund gestellt, damit ich mit der Konsole interagieren und überprüfen konnte, ob er geschlagen wurde. Ich hatte gewonnen. Ich hatte bewiesen, dass ich den erfahrenen Ingenieur schlagen konnte, und verdammt, ich fühlte mich gut dabei.

Bis...

ksh:fork:Ressource vorübergehend nicht verfügbar

Der Anfang vom Ende

So einen Fehler hatte ich noch nie gesehen. Was war das? Warum hat das System das gemacht? Und warum wurde es über meine Konsole gestreamt, sodass ich nichts tun konnte?

[Kostenloser Spickzettel:Tipps für IT-Vorstellungsgespräche] 

Es dauerte einen Moment, aber auch Brett bemerkte das Problem. Er kam heraus, um zu sehen, was passiert war. Ich erklärte ihm meine brillante Strategie, und er seufzte nur, lächelte und sagte mir, ich müsste mich um den Neustart und die erneute Synchronisierung der Server kümmern. Und dann nahm er sich die Zeit, mir zu erklären, was ich falsch gemacht hatte. An diesem Tag erfuhr ich von „exec“ und wie wichtig es ist.

Leider starb Brett ungefähr ein Jahrzehnt danach. Er war ein großartiger Freund, ein großartiger Mentor, und ich vermisse ihn.


Linux
  1. So geben Sie Terminalsitzungen wieder, die mit dem Linux-Skriptbefehl aufgezeichnet wurden

  2. Wie erhalte ich die externe IP-Adresse in einem Shell-Skript?

  3. Wie kann man das Shell-Skript entweder verschlüsseln oder unlesbar machen?

  4. Wie stoppe ich das Loop Bash-Skript im Terminal?

  5. Wie liest man das gesamte Shell-Skript, bevor man es ausführt?

Wie ich Tetris auf dem Mainframe spiele

Wie der Linux-Desktop gewachsen ist

Wie man den Plasma-Desktop wie Unity aussehen lässt

Wie kann ich die Ausgabe von curl -v weiterleiten oder umleiten?

Wie kopiere ich die Terminalausgabe?

So erhalte ich die Anzeigenummer, die mir von X zugewiesen wurde