J'ai créé un script qui tue les processus si l'utilisation du processeur et / ou de la mémoire atteint 80%. Il crée une liste de processus tués lorsque cela se produit. Que puis-je faire pour l'améliorer?
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 ]
me fait me demander combien de CPU ce script seul va consommer. De plus, 3 appels àkill -9
un script s'exécutant en permanence? Cela me donne des frissons ...sleep 1
dans la boucleRéponses:
Je devine que le problème que vous voulez résoudre est que vous avez un processus en cours d'exécution sur votre boîte qui parfois se comporte mal, et se repose toujours un noyau chevillage.
La première chose que vous voulez faire est d'essayer de réparer le programme qui devient fou. C'est de loin la meilleure solution. Je vais supposer que ce n'est pas possible, ou vous avez besoin d'un kluge rapide pour faire fonctionner votre boîte jusqu'à ce qu'elle soit réparée.
Vous voulez, au minimum, limiter votre script pour ne frapper que le seul programme qui vous préoccupe. Il serait préférable que les autorisations limitent votre script comme ceci (par exemple, votre script s'exécute en tant qu'utilisateur X, la seule autre chose qui s'exécute en tant que X est le programme).
Encore mieux serait d'utiliser quelque chose comme
ulimit -t
pour limiter la quantité totale de temps CPU que le programme peut utiliser. De même, s'il consomme toute la mémoire, vérifiezulimit -v
. Le noyau applique ces limites; voir labash
page de manuel (c'est un shell intégré) et lasetrlimit(2)
page de manuel pour plus de détails.Si le problème n'est pas un processus en cours d'exécution, mais plutôt un trop grand nombre de processus en cours d'exécution, alors implémentez une forme de verrouillage pour empêcher plus de X de s'exécuter (ou — cela devrait devenir familier—
ulimit -u
). Vous pouvez également envisager de modifier la priorité du planificateur de ces processus (à l'aide denice
ourenice
), ou, encore plus radicalement, à l'aidesched_setscheduler
de la modification de la stratégie enSCHED_IDLE
.Si vous avez besoin d'encore plus de contrôle, jetez un oeil à des groupes de contrôle (cgroups). En fonction du noyau que vous exécutez, vous pouvez réellement limiter la quantité de temps CPU, de mémoire, d'E / S, etc. qu'un ensemble de processus consomme ensemble. Les groupes de contrôle sont assez flexibles; ils peuvent probablement faire tout ce que vous essayez de faire, sans kluges fragiles. Le Wiki Arch Linux a une introduction aux groupes de discussion qui vaut la peine d'être lue, tout comme la série de groupes de Neil Brown au LWN.
la source
Problèmes:
-n
option de :sort -nrk 2
. Sinon, une ligne avec une%CPU
valeur de 5,0 se retrouvera supérieure à une avec une valeur de 12,0.ps
implémentation, vous souhaiterez peut-être utiliser l'--no-headers
option pour vous débarrasser degrep -v
. Cela vous empêche de rejeter les commandes qui contiennentPID
.echo CPU USAGE is at $CPU_LOAD
, tu voulais direecho CPU USAGE is at $CPU_USAGE
.exit 0
que vous avez inséré lors du débogage (?).Style:
CPU_USAGE_THRESHOLD=800
ligne au début du fichier, car c'est la chose la plus informative et la plus susceptible d'être modifiée même après la stabilité de votre script.-e
option:ps -eo pid -eo pcpu -eo command
est identique àps -eo pid -o pcpu -o command
(tel quelps -eo pid,pcpu,command
).else
clause vide . Cela semble toujours devoir être géré, mais ce n'était pas pour une raison inconnue.la source
Tuer les processus qui utilisent le plus de CPU / mémoire demande des ennuis: regardez simplement ce qu'ils sont en ce moment sur votre machine (ici actuellement firefox, systemd (init), Xorg, gnome-terminal, un ensemble de threads du noyau, xemacs; dont aucun n'est dispensable). Regardez comment tordre OOM-killer de Linux, par exemple ici .
Notez également que la «mémoire utilisée par le processus» est un concept nébuleux, car il existe des bibliothèques partagées, des exécutables partagés et même des parties de zones de données. On peut trouver un certain nombre en chargeant chaque utilisateur d'une fraction de l'espace utilisé, mais même en ajoutant cela ne donne vraiment pas de "mémoire utilisée" (encore moins de "mémoire libérée si le processus disparaît", les parties partagées restent derrière).
la source
J'ai créé un script, kill-process , qui tue certains processus répertoriés dans un tableau, si l'utilisation du processeur est supérieure à XX% pendant YY secondes ou les processus kill qui s'exécutent plus de ZZ secondes.
REMARQUE: voici mon dépôt sur Github: https://github.com/padosoft/kill-process
Voici une capture d'écran:
Les références
Partie essentielle du script (un résumé de code pour la commande supérieure):
Usage:la source
sort
soit le cassort -k9nr
. Sansn
, obtiendra «5,9»>29.4
.