Ich habe ein Skript erstellt, das Prozesse abbricht, wenn die CPU- und / oder Speicherauslastung 80% erreicht. In diesem Fall wird eine Liste der abgebrochenen Prozesse erstellt. Was kann ich tun, um es zu verbessern?
while [ 1 ];
do
echo
echo checking for run-away process ...
CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_USAGE_THRESHOLD=800
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)
if [ $CPU_USAGE -gt $CPU_USAGE_THRESHOLD] ; then
kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
kill -9 $TOPPROCESS
echo system overloading!
echo Top-most process killed $TOPPROCESS
echo CPU USAGE is at $CPU_LOAD
else
fi
exit 0
sleep 1;
done
while [ 1 ]
Ich frage mich, wie viel CPU dieses Skript alleine verbrauchen wird. Auch 3 Aufrufekill -9
in einem Skript laufen ständig? Dies gibt mir die Schüttelfrost ...sleep 1
in der SchleifeAntworten:
Ich vermute, das Problem, das Sie lösen möchten, ist, dass auf Ihrer Box ein Prozess ausgeführt wird, der sich manchmal schlecht verhält und für immer einen Kern festhält.
Das erste, was Sie tun möchten, ist zu versuchen, das Programm zu reparieren, das verrückt wird. Das ist bei weitem die beste Lösung. Ich gehe davon aus, dass dies nicht möglich ist, oder Sie benötigen eine schnelle Kluge, um Ihre Box am Laufen zu halten, bis sie repariert ist.
Sie möchten Ihr Skript zumindest so einschränken, dass nur das eine Programm angezeigt wird, um das Sie sich Sorgen machen. Es ist am besten, wenn die Berechtigungen Ihr Skript wie folgt einschränken (z. B. wird Ihr Skript als Benutzer X ausgeführt, das einzige andere, was als X ausgeführt wird, ist das Programm).
Noch besser wäre es, die
ulimit -t
Gesamt-CPU-Zeit zu begrenzen, die das Programm verwenden kann. Überprüfen Sie in ähnlicher Weise, ob der gesamte Speicher belegt istulimit -v
. Der Kernel erzwingt diese Grenzen. Weitere Informationen finden Sie in derbash
Manpage (es ist eine integrierte Shell) und in dersetrlimit(2)
Manpage.Wenn das Problem nicht ein Amok-Prozess ist, sondern nur zu viele Prozesse ausgeführt werden, implementieren Sie eine Art Sperre, um zu verhindern, dass mehr als X ausgeführt wird (oder - dies sollte bekannt werden
ulimit -u
). Sie können auch in Betracht ziehen, die Scheduler-Priorität dieser Prozesse zu ändern (mithilfe vonnice
oderrenice
) oder noch drastischer, indem Siesched_setscheduler
die Richtlinie in ändernSCHED_IDLE
.Wenn Sie noch mehr Kontrolle benötigen, schauen Sie sich eine Kontrollgruppe (cgroups) an. Abhängig von dem Kernel, den Sie ausführen, können Sie die CPU-Zeit, den Arbeitsspeicher, die E / A usw., die eine ganze Gruppe von Prozessen zusammen verbraucht, tatsächlich begrenzen. Kontrollgruppen sind sehr flexibel; Sie können wahrscheinlich alles tun, was Sie versuchen, ohne zerbrechliche Klugheiten. Das Arch Linux Wiki bietet eine lesenswerte Einführung in cgroups , ebenso wie Neil Browns cgroups-Reihe bei LWN.
quelle
Probleme:
-n
Option verwenden :sort -nrk 2
. Andernfalls wird eine Zeile mit einem%CPU
Wert von 5,0 höher als eine Zeile mit einem Wert von 12,0.ps
Implementierung möchten Sie möglicherweise die--no-headers
Option verwenden, um die zu entfernengrep -v
. Dies verhindert, dass Sie Befehle verwerfen, die enthaltenPID
.echo CPU USAGE is at $CPU_LOAD
, meintest duecho CPU USAGE is at $CPU_USAGE
.exit 0
, was Sie beim Debuggen eingefügt haben (?).Stil:
CPU_USAGE_THRESHOLD=800
Zeile an den Anfang der Datei verschieben, da dies die informativste Sache ist und wahrscheinlich auch dann geändert wird, wenn Ihr Skript stabil ist.-e
Option:ps -eo pid -eo pcpu -eo command
ist dasselbe wieps -eo pid -o pcpu -o command
(wie es istps -eo pid,pcpu,command
).else
Klausel. Das sieht immer so aus, als ob es gehandhabt werden sollte, war aber nicht aus einem unbekannten Grund.quelle
Das Abschalten von Prozessen, die die meiste CPU / den meisten Arbeitsspeicher belegen, ist problematisch: Sehen Sie sich nur an, was sich gerade auf Ihrem Computer befindet (hier derzeit Firefox, Systemd (Init), Xorg, Gnome-Terminal, eine Reihe von Kernel-Threads, Xemacs; keines davon entbehrlich). Sehen Sie sich zum Beispiel hier an, wie Sie den OOM-Killer von Linux optimieren können .
Beachten Sie auch, dass "vom Prozess verwendeter Speicher" ein nebulöses Konzept ist, da es gemeinsam genutzte Bibliotheken, ausführbare Dateien und sogar Teile von Datenbereichen gibt. Man kann sich eine Nummer einfallen lassen, indem man jedem Benutzer einen Bruchteil des genutzten Speicherplatzes in Rechnung stellt, aber selbst wenn man dies addiert, erhält man keinen "verwendeten Speicher" (noch weniger "Speicher wird freigegeben, wenn der Prozess wegfällt", die gemeinsam genutzten Teile bleiben erhalten hinter).
quelle
Ich habe ein Skript namens kill-process erstellt , das einige in einem Array aufgelistete Prozesse beendet, wenn die CPU-Auslastung für YY-Sekunden größer als XX% ist, oder Prozesse beendet, die länger als ZZ-Sekunden ausgeführt werden.
HINWEIS: Hier ist mein Repo auf Github: https://github.com/padosoft/kill-process
Hier ist ein Screenshot:
Verweise
Wesentlicher Teil des Skripts (eine Code-Zusammenfassung für den obersten Befehl):
Verwendung:quelle
sort
sollte seinsort -k9nr
. Ohnen
wird `5.9`> bekommen29.4
.