Ich arbeite an umfangreichen Datensätzen. Beim Testen neuer Software schleicht sich manchmal ein Skript an mich heran, greift schnell auf den gesamten verfügbaren Arbeitsspeicher zu und macht meinen Desktop unbrauchbar. Ich möchte eine Möglichkeit, ein RAM-Limit für einen Prozess festzulegen, damit dieser automatisch beendet wird, wenn er diesen Wert überschreitet. Eine sprachspezifische Lösung wird wahrscheinlich nicht funktionieren, da ich alle möglichen Tools (R, Perl, Python, Bash usw.) verwende.
Gibt es also eine Art Prozessmonitor, mit dem ich einen Schwellenwert für den Arbeitsspeicher festlegen und einen Prozess automatisch beenden kann, wenn er mehr verwendet?
Antworten:
Ich hasse es, der Typ zu sein, der seine eigene Frage beantwortet, aber heute Morgen habe ich eine alternative Methode gefunden, die in ein nettes kleines Hilfsprogramm eingepackt ist. Es wird die CPU-Zeit oder den Speicherverbrauch begrenzen:
https://github.com/pshved/timeout
Ich versuche es zuerst, aber Amey Jah für die nette Antwort. Ich werde nachsehen, ob dieser Fehler bei mir auftritt.
quelle
Ich würde dringend raten, es nicht zu tun . Wie von @chrisamiller vorgeschlagen, wird durch Festlegen von ulimit der für den Prozess verfügbare Arbeitsspeicher begrenzt.
Wenn Sie dennoch darauf bestehen, befolgen Sie dieses Verfahren.
Speichern Sie das folgende Skript als
killif.sh
:Nun mache es ausführbar.
Führen Sie nun dieses Skript auf dem Terminal aus. Ersetzen Sie
PROCID
durch die tatsächliche Prozess-ID undSIZE
durch die Größe in MB.Beispielsweise:
Bei
SIZE
100 wird der Prozess abgebrochen, wenn die RAM-Auslastung mehr als 100 MB beträgt.Achtung: Sie wissen, was Sie versuchen zu tun. Tötungsprozess ist keine gute Idee. Wenn dieser Prozess einen Befehl zum Herunterfahren oder Stoppen enthält, bearbeiten Sie das Skript und ersetzen Sie den
kill -9
Befehl durch diesenshutdown
Befehl.quelle
Probieren Sie das
prlimit
Tool aus derutil-linux
Packung. Es wird ein Programm mit Ressourcenlimits ausgeführt. Es verwendet denprlimit
Systemaufruf, um die Grenzwerte festzulegen, die dann nur vom Kernel erzwungen werden.Sie können 16 Grenzwerte konfigurieren, darunter:
quelle
Das war zu groß für einen Kommentar. Ich habe Ameys ursprüngliches Skript dahingehend geändert, dass es ein einschließt.
pgrep
Anstatt die Prozess-ID manuell einzugeben, können Sie sie einfach nach Namen ausschließen. Beendet z. B../killIf.sh chrome 4000
alle Chrome-Prozesse, deren Speichernutzung 4 GB überschreitet.Achten Sie darauf, eine schmale grep-Zeichenfolge und ein ausreichend großes Speicherlimit auszuwählen, um nicht unnötig unbeabsichtigte Prozesse zu beenden.
quelle