Monitoring Shell Script – Bei zu hoher CPU Auslastung Prozess killen

Monitorin Bash

Es gibt diverse Tools um Server zu Monitoren… In der Linux Welt ist Nagios eins der bekanntesten. Überwachung von Systemen und Ressourcen ist gut, auf Ereignisse reagieren zu können, ist jedoch wichtiger. Nicht immer ist Man-Power gerade zur Stelle, wenn Sie benötigt wird. Seine Systeme soweit zu optimieren das Sie 24/7 rund laufen, sollte das Hauptziel jedes Administrators sein. Wer vorab seine Systeme optimiert, spart langfristig viel Zeit. Dieser Beitrag beschreibt ein Bash-Script, welches einen Prozess auf Linux nach seiner CPU Auslastung überwachen kann. Dieser Beitrag handel über ein Bash Script, dass einen Prozess überwacht Das Script wird bei zu hoher CPU Auslastung den Prozess killen / terminieren

Werbung

Wird ein Auslastungs-Grenzwert längere Zeit überschritten, wird der Prozess terminiert / beendet. Wird ein kritischer Grenzwert überschritten, wird der Prozess direkt terminiert. Bitte testen und optimieren Sie das Script für Ihre Bedürfnisse und stellen Sie sicher das der Prozess wieder an startet, wenn gewünscht.

Das Shell Script – CPU Auslastung monitoren

#!/bin/bash

# ----------------------------------------------------------
# Author: Griep Marco, www.marcogriep.de
# License:
# You can edit, distribute or sell this snippet if you want,
# but please contribute to my webpage www.marcogriep.de
#
# If you use this Script commercially, please send a dollar
# to "griepmarco@gmail.com" via paypal. (Pay-What-You-Want)
# Or a few cryptos to one of the following addresses:
#
# BTC: 3JgwrL3d6EV3YccG5cBNbqiG1YDQ2cqWVP
# BCH: qqrllan8qq9ykrngadn0xttltcsk9efhlu02z8zxnj
# XMR: 41jrUETnp9uXJitNHHLV1FMQRqLPqc6dYhB7wdAbESiy81HCquvM6zAN3QrKST8V2KN7Atauo8MbYFxiGD1HNk937FhBER6
# ETH: 0x4F8f0339bCc687749ad574bdf998b86578bc0661
# LTC: MGLebEsMJ4nBtjiL7xK3hkF5F4xGuHzHXR
#
# ----------------------------------------------------------

# ----------------------
# Ajust for your needs 🙂
# ----------------------
_PROCESS_NAME=firefox         #could be kd001 or something like this
_CPU_THRESHOLD=0.5          #Threshold in GhZ -> 0.2 = 500 mhz -> Will be killed after its still to high after x minutes
_CPU_THRESHOLD_CRIT=0.7          #Threshold in GhZ -> 0.7 = 700 mhz -> Will be killed immediatly
_MAX_WAIT=4             #Iterations. Check how often the CPU is to high. Bsp: A Value of 4 Needs 4 Rounds a 1 minute. 4 Minutes + First run = 5 Minutes. After 5 Minutes CPU is still to high, process will be killed

# -----------------
# DO NOT EDIT!
# Instance Variables
# -----------------
_CPU_LOAD=0
_PID=-1
_CPU_HIGH_FOR=0
 
 
#Endless Loop
while [ true ]
do
  #Search Process
  myProcesses=$(ps ax -o pid,pcpu,command | grep $_PROCESS_NAME)
  processList=$(echo $myProcesses | tr " " "\n")
 
  counter=1;
  for p in $processList
  do
    #Find Process ID
    if [ $counter -eq 1 ] ; then
       _PID=[$p]
      stringLengh=${#_PID}
      stringLengh=$((stringLengh-1));
      _PID=$(echo $_PID | cut -c 2-$stringLengh) 
    fi
 
    #Find CPU Load of current Process
    if [ $counter -eq 2 ] ; then
       _CPU_LOAD=[$p]
      stringLengh=${#_CPU_LOAD}
      stringLengh=$((stringLengh-1));
      _CPU_LOAD=$(echo $_CPU_LOAD | cut -c 2-$stringLengh)
       break; #if everything found, stop iteration
    fi
 
    counter=$((counter+1));
  done
 
  #Check if CPU Load of Process is more than Critical Threshold
  if [ $(bc <<< "$_CPU_LOAD >= $_CPU_THRESHOLD_CRIT") -eq 1 ]; then
    echo "CRITICAL-KILL: CPU usage is over critical threshold. Instant killing process...$_PID by CPU $_CPU_LOAD";
    kill -9 $_PID;
    $_PID=-1;
  else
 
    #If CPU Use is not Critical but to high.
     if [ $(bc <<< "$_CPU_LOAD >= $_CPU_THRESHOLD") -eq 1 ]; then
      echo "INFO: Found PID greater than Threshold...$_PID by CPU $_CPU_LOAD";
 
      #Check if after x Minutes, Process is still to high
      if [ $(bc <<< "$_CPU_HIGH_FOR >= $_MAX_WAIT") -eq 1 ]; then
        kill -9 $_PID
        $_PID=-1;
        _CPU_HIGH_FOR=0;
        echo "KILL: PID has to much CPU usage even after timeout. Killing PID... $_PID by CPU $_CPU_LOAD";
      else
        _CPU_HIGH_FOR=$((_CPU_HIGH_FOR+1));
        echo "WARNING: CPU is over threshold, waiting until timeout reached...$_PID by CPU $_CPU_LOAD";
      fi
 
    else
       echo "INFO: Process is not over Threshold....succeed checking runtime...$_PID by CPU $_CPU_LOAD";
    fi
  fi
 
  #Wait a minute after next run
  sleep 1m
done  

Kommentar verfassen