Kill processo con elevato utilizzo della CPU dopo X tempo? [chiuso]


21

Con Linux ho alcuni processi che tendono a bloccarsi occasionalmente (server di gioco), che finiscono per usare il 100% della CPU.

Sto cercando un programma o uno script per controllare l'utilizzo della cpu di un elenco di processi per nome e se sono al 100% per più di X volte, diciamo 30 secondi, uccidili. Ho provato ps-watcher ma non sono stato in grado di determinare come ottenere questo risultato.

Basta uccidere il processo al 100% di utilizzo non funzionerà in quanto lo colpirà per brevi periodi durante il normale funzionamento.

Ho anche trovato questo script che sembra fare quello che voglio, tuttavia è limitato a un processo: link

Qualsiasi aiuto è molto apprezzato!


Puoi per favore postare di nuovo un link allo script perché questo pastebin.com/m1c814cb4 sembra non essere più valido.

Avrei ragione a indovinare che stai utilizzando i server Minecraft? ;)
PhonicUK,

@Chris S Sei noioso. Questa è una domanda molto interessante Potete fornire una fonte per i vostri reclami "perché attraggono risposte di bassa qualità, supposte e spam e le risposte diventano rapidamente obsolete"? E puoi fare alcuni esempi di come le risposte esistenti a questa domanda sono all'altezza? Non sto trattenendo il respiro.
db

Risposte:


19

Prova a monit .

È possibile utilizzare una configurazione come questa, per svolgere il proprio compito:

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

I dettagli su questa configurazione sono disponibili nella documentazione di Monit .


Grazie per la risposta! Esiste un modo per monitorare il processo senza doverlo avviare con Monit? Ho un sacco di server in esecuzione sulla macchina che sono gestiti attraverso un'interfaccia web, doverli lanciare con Monit non è l'ideale.
user30153,

Certo, l' start programe stop programlinee sono solo per il caso in cui monitle esigenze di riavviare il processo. Puoi ancora avviarlo con il tuo normale script init. monitpuò anche verificare se il programma è già in esecuzione (ad es. tramite il suo file PID o il nome del processo).
joschi,

Fantastico, penso di averlo capito. L'unico problema è la dipendenza da un file pid, dovrò generarne uno per oltre 200 processi e creare regole per ognuno di quelli che suppongo. Grazie per l'aiuto!
user30153,

4

Questo era quello che stavo cercando, e lo sto usando da un po 'di tempo (leggermente modificato). Ultimamente, ho inserito un bug nel mio lavoro, ma devo mantenere in esecuzione l'app (server di gioco).
Avevo citato la parte in cui viene ucciso il PID più in alto, poiché stava uccidendo il PID sbagliato.
Ecco la mia ultima bozza della tua sceneggiatura, finora, trova il sovraccarico più elevato e lo uccide efficacemente (mi invia anche le informazioni ogni volta che fa qualcosa);

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


Questo piccolo script è stato estremamente utile, se non ti piace uccidere qualsiasi processo, l'e-mail da sola ti aiuterà a tenerti informato.


Grazie per la tua risposta! Vorrei solo sottolineare che il tuo ordinamento TOPPROCESSè disattivato. Non ordinerà in base al valore effettivo, invece ordinerà le voci in ordine alfanumerico (ad es. Il 6% avrà la precedenza sul 12%). Un'alternativa migliore potrebbe essere il seguente comando:top -b -n 1 | sed 1,6d | sed -n 2p
Glutanimate,

1
Se la CPU è al 90%, che cos'è CPU_LOAD? e come si calcola la soglia? grazie
Ofir Attia,

1
Questo non rileverà situazioni in cui un processo è al massimo su un server multi core.
UpTheCreek,

0

Di seguito è riportato uno script BASH di esempio che può aiutarti a ottenere alcuni suggerimenti per le tue esigenze.

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

Si noti che il valore di $ CPU_THRESHOLD dovrebbe dipendere dal numero di core (CPU) presenti sul sistema. Una spiegazione dettagliata su questo argomento è disponibile all'indirizzo http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages .

Puoi chiamare il tuo script dall'interno di / etc / inittab o un cronjob per ogni numero di minuti che preferisci. Si noti inoltre che lo script di esempio interromperà il processo più elevato se $ CPU_LOAD è maggiore di $ CPU_THRESHOLD.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.