Frage Prozess mit hoher CPU-Auslastung nach X-Zeit beenden? [geschlossen]


Linux läuft Ich habe ein paar Prozesse, die gelegentlich abstürzen (Spiele-Server), die am Ende mit 100% CPU arbeiten.

Ich suche nach einem Programm oder einem Skript, um die CPU-Nutzung einer Liste von Prozessen nach Namen zu überprüfen, und wenn sie bei 100% für mehr als X Zeit sind, sagen wir 30 Sekunden, sie zu töten. Ich habe versucht, PS-Watcher, war aber nicht in der Lage zu bestimmen, wie dies zu erreichen ist.

Das Beenden des Prozesses bei 100% Auslastung funktioniert nicht, da es während des normalen Betriebs für kurze Zeit gedrückt wird.

Ich habe auch dieses Skript gefunden, das zu tun scheint, was ich will, aber es ist auf einen Prozess beschränkt: Verknüpfung

Jede Hilfe wird sehr geschätzt!


18
2017-12-27 09:18


Ursprung


Kannst du bitte nochmal einen Link zum Skript posten, der dieses verursacht pastebin.com/m1c814cb4 scheint nicht mehr gültig zu sein.
Würde ich recht haben, wenn ich vermute, dass Sie Minecraft-Server betreiben? ;) - PhonicUK


Antworten:


Versuchen Monit.

Sie können eine Konfiguration wie diese verwenden, um Ihre Aufgabe zu erfüllen:

check process gameserver with pidfile /var/run/gameserver.pid
  start program = "/etc/init.d/gameserver start" with timeout 60 seconds
  stop program  = "/etc/init.d/gameserver stop"
  if cpu > 80% for 2 cycles then alert
  if cpu > 95% for 5 cycles then restart
  if totalmem > 200.0 MB for 5 cycles then restart
  if loadavg(5min) greater than 10 for 8 cycles then stop
  if failed port 12345 type tcp with timeout 15 seconds
    then restart
  if 3 restarts within 5 cycles then timeout

Details zu dieser Konfiguration finden Sie in Monits Dokumentation.


18
2017-12-27 12:30



Danke für Ihre Antwort! Gibt es eine Möglichkeit, den Prozess zu überwachen, ohne ihn mit monit starten zu müssen? Ich habe eine Menge Server auf dem Rechner laufen, die über eine Web-Oberfläche verwaltet werden, müssen sie mit Monit starten ist nicht ideal. - user30153
Sicher, die start program und stop program Linien sind nur für den Fall wann monit muss Ihren Prozess neu starten. Sie können es immer noch mit Ihrem normalen Init-Skript starten. monit kann auch prüfen, ob das Programm bereits läuft (z. B. durch seine PID-Datei oder seinen Prozessnamen). - joschi
Fantastisch, ich denke ich habe es herausgefunden. Das einzige Problem ist die Abhängigkeit von einer PID-Datei, ich muss eine für mehr als 200 Prozesse erstellen und Regeln für jede davon erstellen. Danke für die Hilfe! - user30153


Das war, was ich gesucht habe, und benutze es seit einiger Zeit (leicht verändert). In letzter Zeit habe ich einen Fehler in meiner Arbeit, muss aber die App (Game Server) laufen lassen.
Ich hatte den Teil zitiert, wo die oberste PID getötet wurde, da sie die falsche PID tötete.
Hier ist mein letzter Entwurf Ihres Skripts, bis jetzt findet er die oberste Überladung und tötet sie effektiv (sendet mir auch Emails mit der Info, wenn es irgendwas macht);

#!/bin/bash

## Note: will kill the top-most process if the $CPU_LOAD is greater than the $CPU_THRESHOLD.
echo
echo checking for run-away process ...

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=300
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)

if [ $CPU_LOAD -gt $CPU_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 load average is at $CPU_LOAD
  echo 
  echo Active processes...
  ps aux r

  # send an email using mail
  SUBJECT="Runaway Process Report at Marysol"
  # Email To ?
  EMAIL="myemail@somewhere.org"
  # Email text/message
  EMAILMESSAGE="/tmp/emailmessage.txt"
  echo "System overloading, possible runaway process."> $EMAILMESSAGE
  echo "Top-most process killed $TOPPROCESS" >>$EMAILMESSAGE
  echo "Load average was at $CPU_LOAD" >>$EMAILMESSAGE
  echo "Active processes..." >>$EMAILMESSAGE
  echo "$PROCESS" >>$EMAILMESSAGE
  mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE

else
 echo
 echo no run-aways. 
 echo load average is at $CPU_LOAD
 echo 
 echo Active processes...
 ps aux r
fi
exit 0


Dieses kleine Skript war sehr nützlich, wenn Sie es nicht mögen, einen Prozess zu töten, wird die E-Mail allein Ihnen helfen, Sie auf dem Laufenden zu halten.  


4
2017-08-29 12:10



Danke für deine Antwort! Ich möchte nur darauf hinweisen, dass Ihre Sortierung in TOPPROCESS ist aus. Es wird nicht nach dem tatsächlichen Wert sortiert, sondern sortiert die Einträge alphanumerisch (z. B. 6% haben Vorrang vor 12%). Eine bessere Alternative könnte der folgende Befehl sein: top -b -n 1 | sed 1,6d | sed -n 2p - Glutanimate
Wenn die CPU 90% ist, was ist CPU_LOAD? und wie berechnet man den Schwellenwert? Vielen Dank - Ofir Attia
Dies wird Situationen nicht erfassen, in denen ein Prozess auf einem Multi-Core-Server maximiert ist. - UpTheCreek


Unten finden Sie ein Beispiel für ein BASH-Skript, das Ihnen helfen kann, Hinweise für Ihre eigenen Bedürfnisse zu erhalten.

#!/bin/bash

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=700

if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
  kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1)
fi

exit 0

Bitte beachten Sie, dass der Wert von $ CPU_THRESHOLD von der Anzahl der (CPU-) Kerne in Ihrem System abhängen sollte. Eine ausführliche Erklärung zu diesem Thema finden Sie unter http://blog.scoutapp.com/articles/2009/07/31/understanding-load-aerages .

Sie können entweder Ihr Skript aus der / etc / inittab oder einen Cronjob für jede gewünschte Anzahl von Minuten aufrufen. Bitte beachten Sie auch, dass das Beispielskript den obersten Prozess abbricht, wenn $ CPU_LOAD größer als $ CPU_THRESHOLD ist.


0
2018-01-11 16:33