¿Eliminar el proceso con un alto uso de CPU después del tiempo X? [cerrado]


21

Ejecutando Linux tengo algunos procesos que tienden a fallar ocasionalmente (servidores de juegos), que terminan usando 100% de CPU.

Estoy buscando un programa o script para verificar el uso de CPU de una lista de procesos por nombre y si están al 100% por más de X tiempo, digamos 30 segundos, mátenlos. Intenté ps-watcher pero no pude determinar cómo lograr esto.

Simplemente matar el proceso al 100% de uso no funcionará, ya que lo golpeará durante breves períodos durante el funcionamiento normal.

También encontré este script que parece hacer lo que quiero, sin embargo, está limitado a un proceso: enlace

¡Cualquier ayuda es muy apreciada!


¿Puede publicar nuevamente un enlace al script porque este pastebin.com/m1c814cb4 ya no parece ser válido?

¿Tendría razón al adivinar que está ejecutando servidores de Minecraft? ;)
PhonicUK

@ Chris S Eres aburrido. Esta es una pregunta muy interesante. ¿Puede proporcionar una fuente para sus reclamos "porque atraen respuestas de baja calidad, obstinadas y spam, y las respuestas se vuelven obsoletas rápidamente"? ¿Y puede dar algunos ejemplos de cómo las respuestas existentes a esta pregunta están a la altura de esto? No estoy conteniendo la respiración.
Db

Respuestas:


19

Prueba monit .

Puede usar una configuración como esta para realizar su tarea:

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

Los detalles sobre esta configuración se pueden encontrar en la documentación de monit .


¡Gracias por la respuesta! ¿Hay alguna forma de monitorear el proceso sin tener que iniciarlo con monit? Tengo un montón de servidores que se ejecutan en la máquina que se administran a través de una interfaz web, por lo que tener que iniciarlos con monit no es lo ideal.
user30153

Claro, las líneas start programy stop programson solo para el caso cuando monitnecesita reiniciar su proceso. Todavía puede iniciarlo con su script de inicio normal. monittambién puede verificar si el programa ya se está ejecutando (por ejemplo, por su archivo PID o nombre del proceso).
joschi

Fantástico, creo que lo tengo resuelto. El único problema es su dependencia de un archivo pid, voy a tener que generar uno para más de 200 procesos y crear reglas para cada uno, supongo. ¡Gracias por la ayuda!
user30153

4

Esto era lo que estaba buscando, y lo he estado usando durante algún tiempo (ligeramente alterado). Últimamente, he puesto un error en mi trabajo pero necesito mantener la aplicación (servidor del juego) ejecutándose.
Había citado la parte donde se mata el PID superior, ya que estaba matando al PID incorrecto.
Aquí está mi último borrador de su script, hasta ahora, encuentra la sobrecarga más alta y efectivamente la mata (también me envía un correo electrónico con la información cada vez que hace algo);

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


Este pequeño script ha sido extremadamente útil, si no te gusta matar ningún proceso, solo el correo electrónico te ayudará a mantenerte informado.


¡Gracias por tu respuesta! Solo me gustaría señalar que su clasificación TOPPROCESSestá desactivada. No se ordenará por valor real, sino que ordenará las entradas de forma alfanumérica (p. Ej., El 6% tendrá prioridad sobre el 12%). Una alternativa mejor podría ser el siguiente comando:top -b -n 1 | sed 1,6d | sed -n 2p
Glutanimate

1
Si la CPU es 90%, ¿cuál es CPU_LOAD? y como calculas el umbral? gracias
Ofir Attia

1
Esto no detectará situaciones en las que un proceso se maximiza en un servidor multinúcleo.
UpTheCreek

0

A continuación se muestra un script BASH de muestra que puede ayudarlo a obtener algunas sugerencias para sus propias necesidades.

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

Tenga en cuenta que el valor de su $ CPU_THRESHOLD debe depender de la cantidad de núcleos (CPU) que tenga en su sistema. Se puede encontrar una explicación detallada sobre este tema en http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages .

Puede llamar a su script desde dentro de / etc / inittab o un cronjob por cada número de minutos que prefiera. Tenga en cuenta también que el script de ejemplo eliminará el proceso superior si $ CPU_LOAD es mayor que $ CPU_THRESHOLD.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.