Wie kann verhindert werden, dass ein Prozess beendet wird?

Wie kann verhindert werden, dass ein Prozess beendet wird?

Gibt es eine Möglichkeit, das Beenden eines Prozesses auf jeden Fall zu verhindern? Ich weiß davon, nicebin mir aber nicht sicher, ob man das Beenden einer Aufgabe, wie z. B. einer speicherintensiven rakeAufgabe mit langer Laufzeit, verhindern kann, indem man ihr die höchste Priorität gibt:

nice -n -20 rake xyz

Bearbeiten: Der ursprüngliche Verfasser möchte höchstwahrscheinlich, dass es eine hohe Priorität hat, auch wenn die Serverressourcen ebenfalls knapp sind, so dass andere Prozesse zuerst beendet werden.

Antwort1

Sie können Root nicht daran hindern, einen Prozess zu beenden. Oder: Sie können den Server nicht daran hindern, einen Prozess zu beenden, der alle Ihre Ressourcen verbraucht.

Sie können den Befehl so aufteilen, dass er nach der Beendigung neu gestartet wird.

Beispiel mit Code:

Antwort2

Mir ist klar, dass dies eine alte Frage ist, aber da beide Antworten das Offensichtliche ignorieren – oder bestenfalls an der Oberfläche kratzen –, fühlte ich mich veranlasst, meine eigene zu schreiben. Angesichts der Formulierung der Frage war das Allererste, was mir in den Sinn kam, „der OOM-Killer!“. Eine der anderen Antworten behauptet sogar, „es ist nicht automatisch, dass etwas getötet wird“, was aus Benutzersicht absurd ist. Was ist der OOM-Killer, wenn nicht ein Automatismus?

DerOOM-Killerist Ihr größter Feind in Szenarien wie dem beschriebenen, wie der verlinkte Artikel zeigt.

Jetzt kommt es darauf an, was das genaue Szenario ist (Build-Maschine, ein Server ...), aber im Allgemeinen ichTunIch möchte, dass mein Betriebssystem die Ressourcen meines Computers so weit wie möglich nutzt. Deshalb habe ich diese überhaupt gekauft.

Ihre Frage im Detail:

Gibt es eine Möglichkeit, das Beenden eines Prozesses auf jeden Fall zu verhindern?

NEIN,glücklicherweisenicht. Beispielsweise wird der Kernel fehlerhafte Prozesse beenden (z. B. durch SendenSIGSEGV). Dies gilt auch, wenn sich Ihre Aufgabe aufgrund von Ressourcenbeschränkungen nicht richtig verhält (sieheGrenzen.conf,getrlimit/setrlimit). Das heißt, wenn etwas innerhalb Ihrer rakeAufgabe (das aller Wahrscheinlichkeit nach andere Prozesse für einige Aufgaben nutzt) einen Nullzeiger dereferenziert, haben Sie trotzdem Pech gehabt und dieser Teil wird fehlschlagen, was wiederum zum Fehlschlagen der Aufgabe führen kann.

Root wird höchstwahrscheinlich auch in der Lage sein,Signalezu Ihrem Prozess. Und selbst wenn Sieirgendwiees geschafft hat, Ihren Prozess vor allem zu schützen, was mit dem Benutzerbereich zusammenhängt, rootkönnte dennoch ein Kernelmodul laden und diese Bemühungen vom Kernel aus untergraben (möglicherweise mit Ausnahme einer aktiven Kernel-Sperre).

Ich weiß davon, nicebin mir aber nicht sicher, ob das Einräumen der höchsten Priorität für eine Aufgabe, beispielsweise eine speicherintensive rakeAufgabe mit langer Laufzeit, verhindert, dass sie beendet wird: [...]

Es wird es nicht verhindern, aber esWilleverwendet werden alseinsvon mehreren Heuristiken für den OOM-Killer. Also ja, eigentlich der niceWertWillehelfen ... ein bisschen. DieLWN-Artikeldas ich oben bereits verlinkt habe, ergibt folgende Heuristik:

  • wenn die Aufgabeschöner Wert über Nullverdoppelt sich sein Punktestand
  • Superuser oder direkter HardwarezugriffBei Tasks (CAP_SYS_ADMIN, CAP_SYS_RESOURCE oder CAP_SYS_RAWIO) wird die Punktzahl durch 4 geteilt. Dies ist kumulativ, d. h. bei einem Superuser-Task mit Hardwarezugriff wird die Punktzahl durch 16 geteilt.
  • wenn die OOM-Bedingung in einemCPU-Satzund die markierte Aufgabe gehört nicht zu diesem Satz, ihre Punktzahl wird durch 8 geteilt.
  • die resultierende Punktzahl wird mit zwei hoch oom_adj multipliziert (d. h. Punkte <<= oom_adj, wenn es positiv ist, und Punkte >>= -(oom_adj) andernfalls)

Abgesehen von dem niceWert können Sie auch noch weiter gehen, indem Sie dies entweder als Root ausführen (oder mit den angegebenen Fähigkeiten) oder, wenn SieSind root, können Sie sicherstellen, dass Ihr Prozess nicht anfällig für den Abbruch durch den OOM-Killer ist, indem Sie (der Artikel hat diealle Einzelheiten) Erstellen einer Kontrollgruppe:

  1. mount -t cgroup -o oom oom /mnt/oom-killer
  2. mkdir /mnt/oom-killer/invincibles
  3. echo 0 > /mnt/oom-killer/invincibles/oom.priority
  4. echo <pid> > /mnt/oom-killer/invincibles/tasks, wo <pid>ist die Prozess-ID Ihrer Rake-Aufgabe ...

So, das war's. Sie können bestimmte Prozessgruppen vor dem Zorn des OOM-Killers schützen.

Ich bin mir jedoch nicht sicher, ob diese Methode mit dem Vorschlaghammer dieErstedas Beste, was man tun kann. Ich denke, Sie sollten zunächst damit anfangen, zu basteln, oom_adjum zu sehen, ob das Ihrem Prozess hilft, im Wettbewerb mit anderen Prozessen zu bestehen. Besonders wenn es sich um einen Server handelt, ist die GesamtServicekann wichtiger sein als eine bestimmte Aufgabe, die für den Dienst möglicherweise nicht einmal von entscheidender Bedeutung ist. Verwenden Sie sie daher mit Vorsicht. Darüber hinaus sollten Sie auf Speicherfresser achten (sysstat und Freunde sollten dabei helfen). Wenn Sie dies über eine Zeitreihendatenbank tun und die Diagramme zeichnen, können Sie möglicherweise sogar Speicherlecks entdecken.

Wenn nichts davon funktioniert, sollten Sie zuBrendan Greggs Websiteund StartMessungverschiedene Leistungsindikatoren; sehen Sie auch, ob Sie eines seiner Bücher ergattern können. Es ist zum Beispiel möglich, dass Sie in Bezug auf die Speicherzuweisungen innerhalb Ihrer rakeAufgabe so etwas wie eine außer Kontrolle geratene Situation haben. Weil Sie betonenlange LaufzeitUndspeicherintensivaber diese sind nicht unbedingt miteinander verbunden. BPF und Freunde ermöglichen Ihnen Erkenntnisse, die Sie sonst nicht erhalten würden.

Antwort3

Warumwürdees abgetötet werden?

Weil etwas nicht automatisch getötet wird. Wenn Sie diese Frage beantworten und erklären, warum etwas zur Vernichtung ausgewählt wird, können Sie möglicherweise eine Lösung finden.

Da Sie über den Rails-Befehl sprechen rake, gehe ich davon aus, dass dies ein Prozess ist, der auf einem Server ausgeführt wird. Dass Sie befürchten, dass er beendet wird, lässt darauf schließen, dass er vom Server-Host beendet wird, weil er zu viele Ressourcen verbraucht. In solchen Fällen gibt es keine (und sollte auch keine) Möglichkeit geben, Ihren Prozess zu stoppen, wenn er beendet wird.

Wenn Sie eine ressourcenintensive Aufgabe haben, kaufen Sie mehr Ressourcen. Nutzen Sie Ihre eigene Serverzeit. Oder vereinbaren Sie mit dem Host, dass Sie die Aufgabe auf dessen Kosten ausführen können.

verwandte Informationen