Сбор системных метрик Raspberry Pi через rpi_monitor.sh
Обновлено 26.01.2026 (Добавил 💾 Температура NVMe: °C)
В моей IoT-инфраструктуре важно не только следить за датчиками, но и контролировать состояние самой Raspberry Pi. Для этого я написал простой bash-скрипт rpi_monitor.sh, который раз в несколько минут собирает ключевые системные метрики и отправляет их одновременно в MQTT и в локальную базу данных MySQL.
Это позволяет:
- Отображать актуальный статус «железа» в веб-панели,
- Интегрировать данные с Home Assistant через MQTT,
- Отслеживать аномалии: перегрев, высокая загрузка CPU, нехватка памяти или места на диске.
Скрипт работает автономно через cron и не зависит от веб-сервера — даже если PHP-интерфейс ляжет, сбор данных продолжится.
Что именно собирается:
- 🌡️ Температура CPU (через
vcgencmdили/sys/class/thermal), - ⚡ Загрузка CPU (%),
- 💾 Температура NVMe: °C
- 🧠 Использование оперативной памяти (MB и %),
- 💽 Загрузка диска (%),
- 🔋 Напряжение ядра (core voltage),
- ⏱️ Uptime системы,
- 🏠 Список IP-адресов.
Где данные хранятся:
- В таблице
rpi_monitorбазыiot_db, - В MQTT-топике
homeassistant/rpi_monitor(в формате JSON).
Полный код скрипта:
#!/bin/bash
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Конфигурация
MYSQL_USER="iot_user"
MYSQL_PASS="123456"
MYSQL_DB="iot_db"
MQTT_TOPIC="homeassistant/rpi_monitor"
MQTT_HOST="localhost"
# Получаем данные о системе
# Температура NVMe (через smartctl)
NVME_TEMP="N/A"
if command -v smartctl &> /dev/null; then
TEMP_VAL=$(sudo smartctl -a /dev/nvme0n1 2>/dev/null | grep "^Temperature:" | awk '{print $2}')
if [[ -n "$TEMP_VAL" && "$TEMP_VAL" =~ ^[0-9]+$ ]]; then
NVME_TEMP="$TEMP_VAL"
fi
fi
# Температура CPU
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}')
# Напряжение ядра
VOLT_CORE=$(vcgencmd measure_volts core 2>/dev/null | cut -d= -f2 | tr -d 'V')
[ -z "$VOLT_CORE" ] && VOLT_CORE="N/A"
# Загрузка CPU
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=$(uptime -p)
# IP-адреса
IP_ADDRESSES=$(hostname -I | tr '\n' ' ')
# Формируем 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 uptime "$UPTIME" \
--arg ip_addresses "$IP_ADDRESSES" \
--arg volt_core "$VOLT_CORE" \
'{
"cpu_temp": $cpu_temp,
"cpu_load": $cpu_load,
"mem_total": $mem_total,
"mem_used": $mem_used,
"mem_percent": $mem_percent,
"disk_usage": $disk_usage,
"uptime": $uptime,
"ip_addresses": $ip_addresses,
"volt_core": $volt_core,
"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, nvme_temp, timestamp
) VALUES (
'$CPU_TEMP', '$CPU_LOAD', '$MEM_TOTAL', '$MEM_USED', '$MEM_PERCENT',
'$DISK_USAGE', '$VOLT_CORE', '$UPTIME', '$IP_ADDRESSES', '$NVME_TEMP', NOW()
);
EOF
💡 Совет: Запускайте скрипт через cron каждые 5 минут:
*/5 * * * * /opt/iot/rpi_monitor.sh
Комментарии
Пока нет комментариев. Будьте первым!