Scriptet övervakar användningen av CPU och utför användardefinierade åtgärder om en applikation överskrider förinställd gräns för CPU-användning under längre tid än tillåtet.
| Code: |
#!/bin/bash
#
# CPU_MONITOR Version 0.1
# av M Wallin 2007-07-20
#
# CPU_MONITOR övervakar processer och anslutningar
# Om en process använder för mycket CPU under angiven
# tid körs ett kommando (skicka mail, döda processen
# eller liknande)
#
# =-> INSTÄLLNINGAR <-=
#
# MAX CPU per "applikation" (procent 1-100)
max_cpu=20
# Den tid en applikation tillåts ligga över högsta
# tillåtna CPU (sekunder).
accept_sec=30
# Kommando att utföra om en applikation använder för
# mycket CPU under för lång tid. %PID%=process_ID för
# applikationen, %PNAME%=applikationens namn.
#cpu_action="kill -9 %PID%"
#cpu_action="renice +5 %PID%"
cpu_action="echo 'Application %PNAME% with processID %PID% has \
been using moore than $max_cpu % CPU for over $accept_sec seconds.' | \
mail -s 'varning' marwal"
# =-> /INSTÄLLNINGAR <-=
function fetch_cpu() {
PS_LIST=$(ps -eo pcpu,pid -o comm= | sort -k1 -n -r | \
awk '{if ($1 > '$max_cpu'){print $1"_"$2"_"$3}}')
if [ $1 -eq 1 ]; then
PSL1=$PS_LIST
else
PSL2=$PS_LIST
fi
for UPP in $PS_LIST; do
UPP=$(echo $UPP | tr '_' ' ')
UPP=($UPP)
USAGE=${UPP[0]}
USAGE_INT=$(printf "%.f" $USAGE)
PID=${UPP[1]}
PNAME=${UPP[2]}
SEK=$(date +%s)
#echo -e "$USAGE_INT\t$PID\t$PNAME"
done
}
function find_matches() {
for PS2 in $PSL2; do
PS2=$(echo $PS2 | tr '_' ' ')
PS2=($PS2)
PID2=${PS2[2]}
for PS1 in $PSL1; do
PS1=$(echo $PS1 | tr '_' ' ')
PS1=($PS1)
PID1=${PS1[2]}
# applikationer som överskrider CPU TID
if [ $PID2 == $PID1 ]; then
USAGE=${PS1[0]}
USAGE_INT=$(printf "%.f" $USAGE)
PID=${PS1[1]}
PNAME=${PS1[2]}
cpu_action=$(echo $cpu_action | \
sed 's/%PNAME%/'$PNAME'/' | \
sed 's/%PID%/'$PID'/')
# lista applikationer
echo -e "$USAGE_INT\t$PID\t$PNAME"
# utför kommando
eval $cpu_action
fi
done
done
}
clear
fetch_cpu 1
sleep $accept_sec
fetch_cpu 2
find_matches
sleep $accept_sec
while true; do
clear
PSL1=$PSL2
fetch_cpu 2
find_matches
sleep $accept_sec
done
|
Inlägg ändrat av marwal, den 2007-07-20 23:13