He creado un script que mata los procesos si el uso de CPU y / o memoria alcanza el 80%. Crea una lista de procesos eliminados cuando esto sucede. ¿Qué puedo hacer para mejorarlo?
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 hace preguntarme cuánto CPU consumirá este script solo. Además, ¿3 llamadas akill -9
un script que se ejecuta constantemente? Esto me da escalofríos ...sleep 1
al díaRespuestas:
Estoy adivinando el problema que desea resolver es que tiene algún tipo de proceso que se ejecuta en su caja, que a veces se porta mal, y se sienta siempre un núcleo de vinculación.
Lo primero que debes hacer es intentar arreglar el programa que se vuelve loco. Esa es, con mucho, la mejor solución. Voy a suponer que eso no es posible, o necesita un rápido Kluge para mantener su caja funcionando hasta que se solucione.
Usted, como mínimo, desea limitar su secuencia de comandos para que solo llegue al único programa que le preocupa. Sería mejor si los permisos limitaran su script de esta manera (por ejemplo, su script se ejecuta como usuario X, lo único que se ejecuta como X es el programa).
Aún mejor sería usar algo como
ulimit -t
limitar la cantidad de tiempo total de CPU que el programa puede usar. Del mismo modo, si consume toda la memoria, verifiqueulimit -v
. El núcleo impone estos límites; vea la página debash
manual (es un shell incorporado) y la página desetrlimit(2)
manual para más detalles.Si el problema no es un proceso que se está volviendo loco, sino que se están ejecutando demasiados procesos, entonces implemente alguna forma de bloqueo para evitar que se ejecute más de X (o, esto debería estar familiarizándose
ulimit -u
). También puede considerar cambiar la prioridad del planificador de esos procesos (usandonice
orenice
), o incluso más drástico, usandosched_setscheduler
para cambiar la políticaSCHED_IDLE
.Si necesita aún más control, eche un vistazo a los grupos de control (cgroups). Dependiendo del núcleo que esté ejecutando, en realidad puede limitar la cantidad de tiempo de CPU, memoria, E / S, etc., que consume un grupo completo de procesos. Los grupos de control son bastante flexibles; probablemente puedan hacer lo que sea que intentes hacer, sin ningún tipo de fragilidad. Arch Linux Wiki tiene una introducción a cgroups que vale la pena leer, al igual que la serie cgroups de Neil Brown en LWN.
fuente
Cuestiones:
-n
opción:sort -nrk 2
. De lo contrario, una línea con un%CPU
valor de 5.0 terminará más alta que una con un valor de 12.0.ps
implementación, es posible que desee utilizar la--no-headers
opción para deshacerse de élgrep -v
. Eso evita que descarte los comandos que contienePID
.echo CPU USAGE is at $CPU_LOAD
, quisiste decirecho CPU USAGE is at $CPU_USAGE
.exit 0
que insertó durante la depuración (?).Estilo:
CPU_USAGE_THRESHOLD=800
línea al comienzo del archivo, ya que esto es lo más informativo y es más probable que cambie incluso después de que su script sea estable.-e
opción:ps -eo pid -eo pcpu -eo command
es lo mismo queps -eo pid -o pcpu -o command
(como esps -eo pid,pcpu,command
).else
cláusula vacía . Eso siempre parece que debería manejarse, pero no fue por alguna razón desconocida.fuente
Eliminar los procesos que utilizan la mayor parte de la CPU / memoria es un problema: solo mira lo que están ahora en tu máquina (aquí actualmente firefox, systemd (init), Xorg, gnome-terminal, un conjunto de hilos del núcleo, xemacs; ninguno de los cuales es prescindible). Mira cómo ajustar el OOM-killer de Linux, por ejemplo aquí .
También tenga en cuenta que la "memoria utilizada por el proceso" es un concepto nebuloso, ya que hay bibliotecas compartidas, se ejecutan archivos ejecutables e incluso partes de áreas de datos. Se puede obtener algún número cargando a cada usuario con una fracción del espacio utilizado, pero incluso sumando eso realmente no da "memoria utilizada" (aún menos "memoria liberada si el proceso desaparece", las partes compartidas permanecen detrás).
fuente
He creado un script, kill-process , que mata algunos procesos enumerados en una matriz, si el uso de la CPU es mayor al XX% durante los segundos YY o elimina los procesos que se ejecutan más de ZZ segundos.
NOTA: Aquí está mi repositorio en Github: https://github.com/padosoft/kill-process
Aquí hay una captura de pantalla:
Referencias
Parte esencial del script (un resumen de código para el comando superior):
Uso:fuente
sort
debería sersort -k9nr
. Sinn
, obtendrá `5.9`>29.4
.