малинка в корпусе с кулером надо следить за состоянием
Привет! Сегодня расскажу, как я настроил автоматический сбор системных данных с Raspberry Pi и анализ логов с подсчётом ключевых слов — всё это отображается на красивой веб-панели. Ниже — полный гайд без CSS, только HTML и команды.
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.shnano ~/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. Структура таблиц MySQLmysql -u mazzick -pCREATE 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)
);
// Получаем последние данные 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());
}
<!-- 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
✅ Итог
sudo apt update
sudo apt install jq mosquitto-clients mysql-server php-mysql -y
💡 Что можно добавить дальше// === Получаем статистику логов за сегодня ===
$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 данные недоступны
}
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!