Категории

Как я мониторю Raspberry Pi и анализирую логи — пошаговый гайд

13.09.2025 11:49 | коды из категории: IOT умный дом

малинка в корпусе с кулером надо следить за состоянием

про Как я мониторю Raspberry Pi и анализирую логи — пошаговый гайд

📝 Как я мониторю Raspberry Pi и анализирую логи — пошаговый гайд

Привет! Сегодня расскажу, как я настроил автоматический сбор системных данных с Raspberry Pi и анализ логов с подсчётом ключевых слов — всё это отображается на красивой веб-панели. Ниже — полный гайд без CSS, только HTML и команды.

🎯 Что мы сделали

📄 1. Bash-скрипт: rpi_monitor.sh


Создаём скрипт:
nano ~/bash_scripts/rpi_monitor.sh

#!/bin/bash

# Конфигурация
MYSQL_USER="user"
MYSQL_PASS="123456"
MYSQL_DB="iot_db"
MQTT_TOPIC="homeassistant/rpi_monitor"
MQTT_HOST="localhost"

# Получаем данные
CPU_TEMP=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
[ -z "$CPU_TEMP" ] && CPU_TEMP=$(cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}')

CPU_LOAD=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')

MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}')
MEM_PERCENT=$(free | awk '/Mem:/ {printf("%.1f"), $3/$2*100}')

DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')

UPTIME=$(uptime -p)
IP_ADDRESSES=$(hostname -I | tr '\n' ' ')

# Напряжение ядра
VOLT_CORE=$(vcgencmd measure_volts core 2>/dev/null | cut -d= -f2 | tr -d 'V' | xargs printf "%.2f")
[ -z "$VOLT_CORE" ] && VOLT_CORE="N/A"

# Формируем JSON для MQTT
JSON_DATA=$(jq -n \
  --arg cpu_temp "$CPU_TEMP" \
  --arg cpu_load "$CPU_LOAD" \
  --arg mem_total "$MEM_TOTAL" \
  --arg mem_used "$MEM_USED" \
  --arg mem_percent "$MEM_PERCENT" \
  --arg disk_usage "$DISK_USAGE" \
  --arg volt_core "$VOLT_CORE" \
  --arg uptime "$UPTIME" \
  --arg ip_addresses "$IP_ADDRESSES" \
  '{
    "cpu_temp": $cpu_temp,
    "cpu_load": $cpu_load,
    "mem_total": $mem_total,
    "mem_used": $mem_used,
    "mem_percent": $mem_percent,
    "disk_usage": $disk_usage,
    "volt_core": $volt_core,
    "uptime": $uptime,
    "ip_addresses": $ip_addresses,
    "timestamp": now | todate
  }'
)

# Отправляем в MQTT
mosquitto_pub -h $MQTT_HOST -t $MQTT_TOPIC -m "$JSON_DATA"

# Записываем в MySQL
mysql -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB <<EOF
INSERT INTO rpi_monitor (
  cpu_temp, cpu_load, mem_total, mem_used, mem_percent,
  disk_usage, volt_core, uptime, ip_addresses, timestamp
) VALUES (
  '$CPU_TEMP', '$CPU_LOAD', '$MEM_TOTAL', '$MEM_USED', '$MEM_PERCENT',
  '$DISK_USAGE', '$VOLT_CORE', '$UPTIME', '$IP_ADDRESSES', NOW()
);
EOF

Даём права:

chmod +x ~/bash_scripts/rpi_monitor.sh

📄 2. Скрипт анализа логов: log_analyzer.sh

Создаём:
nano ~/bash_scripts/log_analyzer.sh

Содержимое:

#!/bin/bash

LOG_FILE="/var/log/syslog"
MYSQL_USER="user"
MYSQL_PASS="123456"
MYSQL_DB="iot_db"
DATE=$(date '+%Y-%m-%d')

KEYWORDS=("error" "failed" "denied" "warning" "reboot")

mysql -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "DELETE FROM log_stats WHERE date = '$DATE';"

for KEYWORD in "${KEYWORDS[@]}"; do
    COUNT=$(grep -i "$KEYWORD" "$LOG_FILE" | wc -l)
    mysql -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "
    INSERT INTO log_stats (keyword, count, date) VALUES ('$KEYWORD', $COUNT, '$DATE');
    "
done

Права:

chmod +x ~/bash_scripts/log_analyzer.sh
🗃️ 3. Структура таблиц MySQL
Подключись к MySQL:
mysql -u mazzick -p

CREATE TABLE IF NOT EXISTS rpi_monitor (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cpu_temp VARCHAR(10),
    cpu_load VARCHAR(10),
    mem_total VARCHAR(10),
    mem_used VARCHAR(10),
    mem_percent VARCHAR(10),
    disk_usage VARCHAR(10),
    volt_core VARCHAR(10) DEFAULT 'N/A',
    uptime TEXT,
    ip_addresses TEXT,
    timestamp DATETIME
);

CREATE TABLE IF NOT EXISTS log_stats (
    id INT AUTO_INCREMENT PRIMARY KEY,
    keyword VARCHAR(50),
    count INT DEFAULT 0,
    date DATE,
    UNIQUE KEY unique_keyword_date (keyword, date)
);


🌐 4. Вывод данных на index.php
Добавляем в index.php (после подключения к БД):

// Получаем последние данные Raspberry Pi
$rpi_data = null;
try {
    $stmt_rpi = $pdo->query("SELECT * FROM rpi_monitor ORDER BY timestamp DESC LIMIT 1");
    $rpi_data = $stmt_rpi->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    error_log("Ошибка RPi: " . $e->getMessage());
}

Добавляем HTML-блоки в тело страницы:

<!-- Raspberry Pi Monitoring -->
<?php if ($rpi_data): ?>
<div>
    <h3>Raspberry Pi Статус</h3>
    <p>🌡️ Температура CPU: <strong><?= htmlspecialchars($rpi_data['cpu_temp']) ?>°C</strong></p>
    <p>⚡ Загрузка CPU: <strong><?= htmlspecialchars($rpi_data['cpu_load']) ?>%</strong></p>
    <p>🧠 Память: <strong><?= htmlspecialchars($rpi_data['mem_used']) ?>MB / <?= htmlspecialchars($rpi_data['mem_total']) ?>MB (<?= htmlspecialchars($rpi_data['mem_percent']) ?>%)</strong></p>
    <p>💽 Диск: <strong><?= htmlspecialchars($rpi_data['disk_usage']) ?>%</strong></p>
    <p>🔋 Напряжение ядра: <strong><?= htmlspecialchars($rpi_data['volt_core']) ?>V</strong></p>
    <p>⏱️ Uptime: <?= htmlspecialchars($rpi_data['uptime']) ?></p>
    <p>🏠 IP: <?= htmlspecialchars($rpi_data['ip_addresses']) ?></p>
    <p>🕒 Последнее обновление: <?= htmlspecialchars($rpi_data['timestamp']) ?></p>
</div>
<?php endif; ?>

<!-- Log Analysis -->
<?php if (!empty($log_stats)): ?>
<div>
    <h3>📊 Анализ логов (<?= date('Y-m-d') ?>)</h3>
    <?php foreach ($log_stats as $keyword => $count): ?>
        <p><strong><?= ucfirst(htmlspecialchars($keyword)) ?>:</strong> <?= $count ?></p>
    <?php endforeach; ?>
    <small>Обновляется каждый час</small>
</div>
<?php endif; ?>

⏱️ 5. Добавляем в cron
Открываем:

crontab -e
Добавляем:
# Сбор данных каждые 5 минут
*/5 * * * * /home/mazzick/bash_scripts/rpi_monitor.sh >/dev/null 2>&1

# Анализ логов каждый час
0 * * * * /home/mazzick/bash_scripts/log_analyzer.sh >/dev/null 2>&1
✅ Итог

Теперь у тебя:
Автоматически собираются и сохраняются системные метрики RPi. Каждый час анализируются логи — считаются ключевые слова. Всё красиво отображается на главной странице.
Никаких ручных действий — система работает сама.

🛠️ Требуемые пакеты
Убедись, что установлены:

sudo apt update
sudo apt install jq mosquitto-clients mysql-server php-mysql -y
💡 Что можно добавить дальше
Графики через Chart.js
Уведомления в Telegram при перегреве
Мониторинг других логов (nginx, auth.log)
Экспорт в CSV / резервное копирование

// === Получаем статистику логов за сегодня ===
$log_stats = [];
try {
    $stmt_log = $pdo->prepare("SELECT keyword, count FROM log_stats WHERE date = ?");
    $stmt_log->execute([date('Y-m-d')]);
    $log_rows = $stmt_log->fetchAll(PDO::FETCH_ASSOC);

    foreach ($log_rows as $row) {
        $log_stats[$row['keyword']] = (int)$row['count'];
    }
} catch (PDOException $e) {
    error_log("Ошибка получения статистики логов: " . $e->getMessage());
    // Не критично — просто не покажем блок
}

// === Получаем последние данные Raspberry Pi ===
$rpi_data = null;
try {
    $stmt_rpi = $pdo->query("
        SELECT * FROM rpi_monitor
        ORDER BY timestamp DESC
        LIMIT 1
    ");
    $rpi_data = $stmt_rpi->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    error_log("Ошибка получения данных RPi: " . $e->getMessage());
    // Не останавливаем всю страницу, если RPi данные недоступны
}
Теги: #devops #sysadmin #linux #PHP #MySQL #MQTT #IoT #cron #monitoring #bash_script #system_monitor #log_analysis #voltage_monitoring #homelab

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку

Важно: Блог-эксперимент

Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


кто я | книга | контакты без контактов

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA