109 lines
3.2 KiB
Bash
Executable File
109 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# === Configuration ===
|
|
THRESHOLD=50 # CPU usage threshold (%)
|
|
LOG_FILE="/home/isen/isen2024/cpualert.log"
|
|
STATE_FILE="/home/isen/isen2024/cpualertstate" # Tracks alert state
|
|
HOSTNAME=$(hostname)
|
|
DATE=$(date '+%Y-%m-%d %H:%M:%S')
|
|
# === Functions ===
|
|
# Function to check required commands
|
|
check_dependencies() {
|
|
for cmd in top df ; do
|
|
if ! command -v "$cmd" &>/dev/null; then
|
|
echo "$DATE - ERROR: Required command '$cmd' not found." | tee -a "$LOG_FILE"
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
# Function to get average CPU usage across all cores
|
|
get_cpu_usage() {
|
|
# Extract CPU usage using top command
|
|
local usage
|
|
usage=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}')
|
|
#Extrait la 8ème colonne ($8), qui correspond au pourcentage de temps CPU inactif (%id).
|
|
#Calcule l utilisation CPU en soustrayant ce pourcentage d'inactivité de 100 (exemple : si $8 vaut 85.3, alors 100 - 85.3 = 14.7).
|
|
#Le resultat est stocké dans la variable usage.
|
|
# Handle empty or invalid values
|
|
if [[ -z "$usage" || "$usage" == *"e+"* ]]; then
|
|
echo "0"
|
|
else
|
|
echo "${usage%.*}" # strip decimals
|
|
fi
|
|
}
|
|
#Fonction pour afficher l'espace disque de /home
|
|
espace_disque() {
|
|
pourcentage_disque=$( df -h /home | grep overlay | awk '{print $5}')
|
|
echo "Pourcentge de memoire utilise: ${pourcentage_disque}"
|
|
}
|
|
#Fonction pour afficher le nombre de processus:
|
|
nb_proc() {
|
|
nb_proc=$(ps aux --no-header | wc -l)
|
|
echo "Nombres de precessus en cours sur la machine: ${nb_proc}"
|
|
}
|
|
# function to log messages in logfile
|
|
|
|
log_message() {
|
|
echo "$DATE - $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
#fonction pour afficher le résultat dans le terminal
|
|
prompt_message() {
|
|
echo "$1"
|
|
}
|
|
|
|
# === Main Function ===
|
|
monitoring() {
|
|
clear
|
|
check_dependencies
|
|
CPU_USAGE=$(get_cpu_usage)
|
|
CPU_INT=${CPU_USAGE%.*}
|
|
if [[ ! "$CPU_INT" =~ ^[0-9]+$ ]]; then
|
|
log_message "ERROR: Invalid CPU usage value '$CPU_INT'"
|
|
prompt_message "ERROR: Invalid CPU usage value '$CPU_INT'"
|
|
exit 1
|
|
fi
|
|
if (( CPU_INT > THRESHOLD )); then
|
|
# CPU high
|
|
if [[ ! -f "$STATE_FILE" ]]; then
|
|
log_message "ALERT: CPU usage ${CPU_INT}% > ${THRESHOLD}%. "
|
|
prompt_message "ALERTE: CPU usage ${CPU_INT}% > ${THRESHOLD}"
|
|
else
|
|
log_message "ALERT: CPU usage ${CPU_INT}% > ${THRESHOLD}%."
|
|
prompt_message "ALERT: CPU usage ${CPU_INT}% > ${THRESHOLD}%."
|
|
fi
|
|
else
|
|
# CPU normal
|
|
if [[ -f "$STATE_FILE" ]]; then
|
|
log_message "RECOVERY: CPU usage ${CPU_INT}% < ${THRESHOLD}%."
|
|
prompt_message "RECOVERY: CPU usage ${CPU_INT}% < ${THRESHOLD}%."
|
|
rm -f "$STATE_FILE"
|
|
else
|
|
log_message "OK: CPU usage ${CPU_INT}% within threshold (${THRESHOLD}%)"
|
|
prompt_message " OK: CPU usage ${CPU_INT}% within threshold (${THRESHOLD}%)"
|
|
fi
|
|
fi
|
|
espace_disque
|
|
nb_proc
|
|
}
|
|
main() {
|
|
if [ "$#" -ne 2 ] || [ "$1" != "-w" ]; then
|
|
echo "Erreur : Utilisation incorrecte."
|
|
echo "Usage: $0 -w X (X = intervalle en secondes)"
|
|
sleep 2
|
|
monitoring
|
|
exit 1
|
|
fi
|
|
|
|
# Récupération de l'intervalle
|
|
local sleeptime=$2
|
|
echo "lancement du monito avec un rafraichissement de $sleeptime secondes"
|
|
while true; do
|
|
monitoring
|
|
sleep "$sleeptime"
|
|
done
|
|
|
|
}
|
|
|
|
main "$1" "$2"
|