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!
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 .
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.
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 $.