Was ist der beste Weg, um nach einer Gabelbombe aufzuräumen?


21
$ ls
bash: no more processes

Oh oh. Sieht aus wie jemand eine Gabelbombe gemacht. Wo ich früher gearbeitet habe, bedeutete dies so ziemlich, dass der gemeinsam genutzte Server aus- und wieder eingeschaltet werden musste, da selbst die Sysadmins mit root das Problem oft nicht bereinigen konnten. Oft bekamen sie nicht einmal eine Aufforderung.

Ich habe ein paar Tricks gehört (insbesondere, um STOP-Signale anstelle von KILL-Signalen zu senden, da letztere es den verbleibenden Threads ermöglichen würden, die getöteten Threads sofort zu ersetzen), aber ich habe noch nie eine umfassende Anleitung mit dem Titel So, You Have Yourself gesehen eine Gabelbombe?

Lass uns einen machen.

Antworten:


10

Verhindern Sie, dass die Gabelbombe das Prozesslimit mit einem pro Benutzer angemessenen Prozesslimit mit ulimit erschöpft .

Auf diese Weise erschöpft ein einzelner Benutzer sein Prozesskontingent lange bevor das Systemlimit erreicht ist.


6

Das erste, was Sie versuchen sollten, wäre, Benutzer, die angemeldet sind, zum Abmelden zu bewegen. Es ist möglich, dass ihre Shell der übergeordnete Prozess des Prozesses ist, der das gesamte Forking ausführt, und das könnte das Problem beenden.

Wenn dies nicht funktioniert, können Sie versuchen, kill -STOP -2als root zu arbeiten, um alle Prozesse einzufrieren, die als ein anderer Benutzer als root ausgeführt werden. Wenn dies funktioniert, können kill -CONT <pid>Sie einige bekannte Prozesse, die nichts mit der Gabelbombe zu tun haben, wieder freigeben und abbrechen, um das Problem der vollständigen Prozesstabelle zu beseitigen und Ihnen eine gewisse Atempause zu geben, um die ursprüngliche Ursache des Problems aufzuspüren und zu beseitigen. Sendmail ist ein gutes Beispiel für einen Systemprozess, der beendet werden kann, da die Identifizierung anhand der PID-Datei einfach ist. Zum Beispiel kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid).


Unter welchem ​​Betriebssystem sehen Sie eine "-2" -Option für das Beenden? Ich sehe es nicht in der Manpage unter Linux.
Raldi

1
Dies sollte in den meisten Betriebssystemen funktionieren, da Sie einen negativen Wert für die PID angeben. Wenn <pid> kleiner als -1 ist, wird kill an jeden Prozess in der Prozessgruppe <pid> gesendet. Durch Senden eines STOP-Zeichens an pid -2 sollten alle Prozesse gestoppt werden, bei denen es sich nicht um spezielle Systemprozesse oder Prozesse im Stammbesitz handelt.

Siehe die kill (2) Manpage für das Töten einer "negativen PID", aber ich glaube immer noch nicht, dass dies funktioniert. Warum sollten sich alle Nicht-Init-Prozesse in Gruppe 2 befinden? Ich verstehe, dass Sie init vermeiden möchten, da die Ergebnisse des Stopps oftmals ziemlich tödlich sind, aber ...
ephemient 9.10.08

@ephemient, 2 ist zu niedrig, um eine Prozessgruppen-ID zu sein, also ist es vielleicht ein weiterer spezieller Wert.
Joshudson


3

Ich bin mir nicht sicher, wie Sie überhaupt ein STOP-Signal senden könnten, da für das Laichen killein verfügbares Prozesshandle erforderlich wäre. Außerdem werden Systeme meiner Erfahrung nach überlastet und unbrauchbar, lange bevor die Prozesse ausgehen.

Haben Sie schon einmal darüber nachgedacht, Prozesslimits pro Benutzer durchzusetzen ulimit? Das würde Ihre Benutzer daran hindern, Gabelbomben abzufeuern (versehentlich oder nicht).


3
kill ist eine eingebaute Shell, zumindest in bash.
Raldi

1
Ich denke, das ist eine Schlüsselkomponente - identifizieren Sie die eingebauten Komponenten für Ihre bevorzugte Shell.

2
Wenn es sich nicht um eine integrierte Funktion handelt, können Sie "exec kill PID" ausführen, die nicht verzweigt. Es ist jedoch riskant, da Sie möglicherweise keine andere Shell erhalten, wenn dies nicht funktioniert. Betrachten Sie es als den Bienenstich-Ansatz für die Systemadministration!
Stephen Darlington

2

Einige BSD-Systeme können die letzten fünf Prozesse für root reservieren. Vielleicht hat Ihr System diese Fähigkeit.


3
Wie konfigurieren Sie das System dafür?
Nik Reiman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.