Перейти к содержимому

Уведомления о перегреве CPU/GPU

Забитый пылью радиатор, зависший вентилятор, тяжёлый рендер летом — и вот процессор уже уходит в троттлинг, а компьютер начинает подтормаживать. Проще узнать об этом сразу из push, чем гадать, почему всё тормозит.

Ставим lm-sensors и снимаем температуру машинно-читаемо через sensors -u. Один раз запустите sudo sensors-detect, чтобы определились датчики.

Скрипт ~/bin/notifly-cpu-temp:

#!/usr/bin/env bash
set -eu
set -a; source ~/.notifly.env; set +a
WARN=80 # °C — предупреждение
CRIT=90 # °C — критично
STATE_FILE=/tmp/notifly-cputemp.state
PREV=$(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=CRIT
elif (( MAX >= WARN )); then NOW=WARN
else NOW=OK
fi
send() { ~/bin/notifly-send "$1" "$2" "$3"; }
BODY="CPU: ${CPU}°C${GPU:+, GPU: ${GPUC}"
# Шлём только при изменении уровня, чтобы не спамить каждую минуту.
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 ;;
esac
fi
echo "$NOW" > "$STATE_FILE"

Делаем исполняемым и заводим systemd-таймер на каждые 30 секунд:

~/.config/systemd/user/notifly-cpu-temp.service
[Unit]
Description=Notifly CPU/GPU temperature check
[Service]
Type=oneshot
ExecStart=%h/bin/notifly-cpu-temp
~/.config/systemd/user/notifly-cpu-temp.timer
[Unit]
Description=Run notifly-cpu-temp every 30s
[Timer]
OnBootSec=2min
OnUnitActiveSec=30s
[Install]
WantedBy=timers.target
Окно терминала
systemctl --user daemon-reload
systemctl --user enable --now notifly-cpu-temp.timer

В macOS нет lm-sensors. Температуру снимают утилиты вроде osx-cpu-temp (brew install osx-cpu-temp) или iStats (gem install iStats):

~/bin/notifly-cpu-temp
#!/usr/bin/env bash
set -eu; set -a; source ~/.notifly.env; set +a
CPU=$(osx-cpu-temp | grep -Eo '[0-9]+' | head -1)
# ... та же логика с порогами WARN/CRIT, что и для Linux

Запускаем через launchd с StartInterval — как в рецепте про батарею.

OpenHardwareMonitor (или LibreHardwareMonitor) публикует показания датчиков в WMI-пространство root\OpenHardwareMonitor. Запустите его в фоне, дальше — PowerShell. Предполагается настроенная функция Send-Notifly.

C:\scripts\Notifly-CpuTemp.ps1
. $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 постоянно и слать через мониторинг.