#!/bin/bash # Configuration URL="http://localhost/index.php?v=d" ATTEMPTS_FILE="/tmp/jeedom_fail_count" LAST_CHECK_FILE="/tmp/last_jeedom_check" LOG_FILE="/var/www/html/log/pi_watchdog" INTERVAL=60 # Secondes entre chaque test réel de Jeedom # Trouver dynamiquement la version de PHP PHP_VER=$(php -v | head -n 1 | cut -d " " -f 2 | cut -d "." -f 1,2) PHP_LOG="/var/log/php${PHP_VER}-fpm.log" log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >>$LOG_FILE } get_os_health() { log_message "--- DIAGNOSTIC SYSTÈME AVANT REBOOT ---" # 1. Charge CPU / Uptime log_message "Uptime/Load: $(uptime)" # 2. État détaillé de MariaDB (MySQL) if systemctl is-active --quiet mariadb; then DB_CONN=$(mysqladmin variables | grep -w "max_connections" | awk '{print $4}') log_message "MariaDB: OK (Max connexions autorisées: $DB_CONN)" else log_message "MariaDB: HS ! Tentative de voir le statut : $(systemctl status mariadb | grep 'Active:')" fi # 3. État de PHP (FPM ou Module Apache) # On cherche n'importe quel service PHP-FPM actif PHP_FPM_SVC=$(systemctl list-units --type=service --state=running | grep -o "php.*-fpm.service" | head -1) if [ -z "$PHP_FPM_SVC" ]; then log_message "PHP-FPM: Non trouvé. Vérification du module PHP Apache..." if apache2ctl -M 2>/dev/null | grep -q "php"; then log_message "PHP: Utilisé en mode module Apache (Standard)" else log_message "PHP: ERREUR - Aucun moteur PHP détecté !" fi else WORKERS=$(ps aux | grep "$PHP_FPM_SVC" | grep -v grep | wc -l) log_message "PHP-FPM ($PHP_FPM_SVC): OK ($WORKERS processus)" fi # 4. État du Cron et Jeedom JEEDOM_CRON=$(ps aux | grep -v grep | grep "cron.php" | wc -l) log_message "Cron Système: $(systemctl is-active cron) / Jeedom Cron.php: $JEEDOM_CRON" # 5. RAM et Disques log_message "RAM: $(free -h | awk '/^Mem:/ {print $3 "/" $2}')" log_message "SANTÉ DISQUES :" df -h | grep -E '^/dev/root|^/dev/sd|^/dev/nvme' | while read -r line; do log_message " -> $line"; done # 6. Température log_message "Température: $(vcgencmd measure_temp 2>/dev/null || echo 'N/A')" log_message "---------------------------------------" } # 1. Vérifier si on doit faire le test maintenant NOW=$(date +%s) LAST_CHECK=$(cat $LAST_CHECK_FILE 2>/dev/null || echo 0) if [ $((NOW - LAST_CHECK)) -lt $INTERVAL ]; then # On n'a pas encore atteint l'intervalle, on dit au watchdog que tout va bien exit 0 fi # 2. Si on est ici, on fait le test réel echo $NOW >$LAST_CHECK_FILE log_message "Execution curl" HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$URL") log_message "HTTP_CODE $HTTP_CODE" if [ "$HTTP_CODE" -eq 500 ]; then COUNT=$(cat $ATTEMPTS_FILE 2>/dev/null || echo 0) COUNT=$((COUNT + 1)) echo $COUNT >$ATTEMPTS_FILE log_message "ERREUR 500 détectée (Essai $COUNT/6)" if [ "$COUNT" -ge 6 ]; then get_os_health log_message "ÉCHEC CRITIQUE : Signal REBOOT envoyé." rm $ATTEMPTS_FILE exit 1 else log_message "Action : Relance des services..." systemctl restart mariadb systemctl restart apache2 systemctl restart "php${PHP_VER}-fpm" systemctl restart cron exit 0 fi else # Reset si succès [ -f $ATTEMPTS_FILE ] && [ $(cat $ATTEMPTS_FILE) -gt 0 ] && log_message "Rétablissement Jeedom." echo 0 >$ATTEMPTS_FILE exit 0 fi