Уведомления о перегреве CPU/GPU
Забитый пылью радиатор, зависший вентилятор, тяжёлый рендер летом — и вот процессор уже уходит в троттлинг, а компьютер начинает подтормаживать. Проще узнать об этом сразу из push, чем гадать, почему всё тормозит.
Linux: lm-sensors по таймеру
Заголовок раздела «Linux: lm-sensors по таймеру»Ставим lm-sensors и снимаем температуру машинно-читаемо через sensors -u.
Один раз запустите sudo sensors-detect, чтобы определились датчики.
Скрипт ~/bin/notifly-cpu-temp:
#!/usr/bin/env bashset -euset -a; source ~/.notifly.env; set +a
WARN=80 # °C — предупреждениеCRIT=90 # °C — критичноSTATE_FILE=/tmp/notifly-cputemp.statePREV=$(cat "$STATE_FILE" 2>/dev/null || echo OK)
# Максимальная температура среди всех ядер (строки вида "tempN_input: 74.000").CPU=$(sensors -u | awk '/_input:/ {print $2}' | sort -nr | head -1)CPU=${CPU%.*}
# Температура GPU NVIDIA (если есть nvidia-smi).GPU=""if command -v nvidia-smi >/dev/null; then GPU=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits | sort -nr | head -1)fi
# Берём максимум из CPU и GPU для оценки уровня.MAX=$CPU[[ -n "$GPU" && "$GPU" -gt "$MAX" ]] && MAX=$GPU
if (( MAX >= CRIT )); then NOW=CRITelif (( MAX >= WARN )); then NOW=WARNelse NOW=OKfi
send() { ~/bin/notifly-send "$1" "$2" "$3"; }BODY="CPU: ${CPU}°C${GPU:+, GPU: ${GPU}°C}"
# Шлём только при изменении уровня, чтобы не спамить каждую минуту.if [[ "$NOW" != "$PREV" ]]; then case "$NOW" in CRIT) send "🔥 Перегрев ${MAX}°C" "$BODY — проверьте охлаждение!" 9 ;; WARN) send "🌡 Нагрев ${MAX}°C" "$BODY" 6 ;; OK) [[ "$PREV" != OK ]] && send "✅ Температура в норме" "$BODY" 3 ;; esacfi
echo "$NOW" > "$STATE_FILE"Делаем исполняемым и заводим systemd-таймер на каждые 30 секунд:
[Unit]Description=Notifly CPU/GPU temperature check
[Service]Type=oneshotExecStart=%h/bin/notifly-cpu-temp[Unit]Description=Run notifly-cpu-temp every 30s
[Timer]OnBootSec=2minOnUnitActiveSec=30s
[Install]WantedBy=timers.targetsystemctl --user daemon-reloadsystemctl --user enable --now notifly-cpu-temp.timermacOS: осторожно с датчиками
Заголовок раздела «macOS: осторожно с датчиками»В macOS нет lm-sensors. Температуру снимают утилиты вроде osx-cpu-temp
(brew install osx-cpu-temp) или iStats (gem install iStats):
#!/usr/bin/env bashset -eu; set -a; source ~/.notifly.env; set +aCPU=$(osx-cpu-temp | grep -Eo '[0-9]+' | head -1)# ... та же логика с порогами WARN/CRIT, что и для LinuxЗапускаем через launchd с StartInterval — как в рецепте про
батарею.
Windows: OpenHardwareMonitor + WMI
Заголовок раздела «Windows: OpenHardwareMonitor + WMI»OpenHardwareMonitor (или LibreHardwareMonitor) публикует показания датчиков в
WMI-пространство root\OpenHardwareMonitor. Запустите его в фоне, дальше —
PowerShell. Предполагается настроенная
функция Send-Notifly.
. $env:USERPROFILE\Documents\WindowsPowerShell\Notifly.ps1
$Warn = 80$Crit = 90$State = "$env:LOCALAPPDATA\notifly-cputemp.state"$prev = if (Test-Path $State) { (Get-Content $State -Raw).Trim() } else { "OK" }
# Все датчики температуры от OpenHardwareMonitor.$temps = Get-CimInstance -Namespace "root\OpenHardwareMonitor" -ClassName Sensor ` -ErrorAction SilentlyContinue | Where-Object { $_.SensorType -eq "Temperature" }$max = ($temps | Measure-Object -Property Value -Maximum).Maximum$max = [int]$max
$now = if ($max -ge $Crit) { "CRIT" } elseif ($max -ge $Warn) { "WARN" } else { "OK" }
if ($now -ne $prev) { switch ($now) { "CRIT" { Send-Notifly -Title "🔥 Перегрев $max°C" -Message "Проверьте охлаждение!" -Priority 9 } "WARN" { Send-Notifly -Title "🌡 Нагрев $max°C" -Message "" -Priority 6 } "OK" { if ($prev -ne "OK") { Send-Notifly -Title "✅ Температура в норме" -Message "$max°C" -Priority 3 } } }}$now | Set-Content $StateРасписание каждые 30 секунд:
$Action = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\scripts\Notifly-CpuTemp.ps1"$Trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) ` -RepetitionInterval (New-TimeSpan -Seconds 30)Register-ScheduledTask -TaskName "Notifly CPU Temp" -Action $Action -Trigger $Trigger- Узнаёте о перегреве до троттлинга и внезапной перезагрузки.
- Два уровня — 80 °C «присмотреться» и 90 °C «спасать» с приоритетом 9, который проходит даже в DND (см. приоритеты).
- Push «температура в норме» закрывает историю — понятно, что кулер справился.
Что улучшить дальше
Заголовок раздела «Что улучшить дальше»- Добавить скорость вентиляторов (
sensors -u, полеfanN_input) — заметить заклинивший кулер. - Слать в сообщении и текущую нагрузку (
uptime,nvidia-smi -q -d UTILIZATION). - Для домашнего сервера — держать watchdog постоянно и слать через мониторинг.