web-dev-qa-db-fra.com

Tuer le processus avec une utilisation élevée du processeur après X fois?

En cours d'exécution Linux, j'ai quelques processus qui ont tendance à s'écraser de temps en temps (serveurs de jeux), qui finissent par utiliser 100% de processeur.

Je cherche un programme ou un script pour vérifier l'utilisation de la CPU d'une liste de processus par nom et s'ils sont à 100% pour plus de x Time, disent 30 secondes, les tuer. J'ai essayé PS-Warkeer mais n'a pas pu déterminer comment accomplir cela.

Il suffit de tuer le processus à 100% d'utilisation ne fonctionnera pas car il va frapper cela pour de brèves périodes pendant le fonctionnement normal.

J'ai également trouvé ce script qui semble faire ce que je veux, mais il est limité à un processus: link

Toute aide est grandement appréciée!

21
user30153

Essayez Monit .

Vous pouvez utiliser une configuration comme celle-ci pour accomplir votre tâche:

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

Les détails de cette configuration peuvent être trouvés dans Monit Documentation .

19
joschi

C'était ce que je cherchais et l'utilisait depuis un certain temps (légèrement altéré). Dernièrement, j'ai mis un bug dans mon travail mais j'ai besoin de conserver l'application (serveur de jeu) en cours d'exécution.
[.____] J'avais cité la partie où le plus haut PID est tué, car il tue le mauvais PID.
Voici mon dernier brouillon de votre script, jusqu'à présent, il trouve la surcharge supérieure et la tue de manière efficace (me le tue de manière efficace (aussi emails avec les informations chaque fois que cela fait quoi que ce soit);

#!/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="[email protected]"
  # 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


[.____] Ce petit script a été extrêmement utile, si vous ne l'aimez pas tuer aucun processus, le courrier électronique seul vous aidera à vous tenir au courant.

4
Angelo Felix

Vous trouverez ci-dessous un exemple de script de bash pouvant vous aider à obtenir des indications pour vos propres besoins.

#!/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

Veuillez noter que la valeur de votre $ CPU_THRESHOLD doit dépendre du nombre de cœurs (CPU) que vous avez sur votre système. Une explication détaillée sur cette rubrique peut être trouvée à http://blog.scoutapp.com/articles/2009/07/31/EDERSTANDING-Adloadingages .

Vous pouvez appeler votre script de l'intérieur/etc/inittab ou un cronjob pour chaque nombre de minutes que vous préférez. Veuillez noter également que l'exemple de script va tuer le processus le plus élevé si la CPU_LOAD $ est supérieure à la CPU_THRESHOLD $.

0
bintut