Как я сделал бесплатный монитор температуры CPU и GPU для Mac, который живёт в строке меню и не просит пароль
macOS прячет температуру чипа за приватными API. Большинство мониторов — это либо тяжёлые Electron-приложения, либо утилиты, которые требуют sudo при каждом запуске, либо платный iStat Menus. Я хотел просто видеть, насколько горячий мой M4 Max. Поэтому написал нативное приложение на Swift — и выложил с открытым кодом.Каждый, у кого есть MacBook на Apple Silicon, рано или поздно задаётся вопросом: а насколько горячо он сейчас работает? Особенно когда вентиляторы раскручиваются под нагрузкой, корпус нагревается, а ты компилируешь большой проект или рендеришь видео
И тут выясняется неприятное: macOS не показывает температуру чипа. Нигде. Ни в «Мониторинге системы», ни в настройках. Apple держит эти данные за приватными API и наружу не отдаёт.
Что предлагает рынок
Когда я полез искать решение, оказалось, что выбор сводится к трём вариантам, и каждый меня не устраивал.
Первый — мониторы на Electron. Это веб-приложения, завёрнутые в браузерный движок. Они едят сотни мегабайт оперативной памяти просто чтобы показать одно число в углу экрана. Запускать целый Chromium ради температуры — абсурд.
Второй — утилиты, которые требуют sudo при каждом запуске. То есть каждый раз, когда ты хочешь увидеть температуру, нужно вводить пароль администратора. Это быстро надоедает.
Третий — платные пакеты вроде iStat Menus. Хороший софт, но он показывает целую панель из десятков показателей, а стоит денег. Мне же нужно было одно: температура. Платить за комбайн ради одной функции не хотелось.
Я решил, что должно существовать что-то лёгкое, быстрое и бесплатное. Не нашёл — написал сам.
ThermalBar
Получилось крошечное нативное приложение на Swift, которое живёт в строке меню и показывает три вещи в реальном времени: температуру процессора, температуру видеоядра и потребляемую мощность в ваттах.
Выглядит это так: C 52° G 48° 35W — прямо в строке меню, всегда на виду.
Главная фишка — цветовая индикация. Каждое значение окрашивается в зависимости от того, насколько всё горячо:
- зелёный — холодный режим, всё спокойно;
- оранжевый — нагревается;
- красный — горячо;
- тёмно-красный — критично.
Один взгляд на строку меню — и сразу понятно состояние, без необходимости вчитываться в цифры. Пороги при этом настраиваются под себя, любую метрику можно включить или выключить.
Техническая часть: как читать температуру без sudo
Дальше будет интересно тем, кто разбирается. Остальные могут смело пропустить до раздела про установку.
Самое сложное было — получить температуру вообще, да ещё и без прав root. Большинство утилит для этого либо ставят системное расширение, либо запускаются от администратора. Я хотел обойтись без этого.
Решение нашлось в приватном API IOKit — фреймворке IOHIDEventSystemClient. Через него можно подключиться к системе HID-датчиков и прочитать температурные сенсоры напрямую, без повышения привилегий. Тот же механизм, по сути, использует системная утилита powermetrics, только ей нужен sudo, а через HID-клиент можно обойтись без него.
Дальше всплыла любопытная деталь, характерная именно для Apple Silicon. Когда я выгрузил полный список датчиков на своём M4 Max, их оказалось 53 штуки. Все они — температурные сенсоры группы AppleVendor: PMU tdie и tdev (это термодатчики кристалла), датчики батареи, датчик NAND-памяти.
И вот что важно: отдельного датчика температуры GPU на M4 Max попросту нет. На некоторых старых чипах он встречался, но здесь видеоядро и процессорные ядра живут на одном кристалле, и Apple не выделяет для GPU отдельный сенсор. Те самые tdie-датчики разбросаны по всему кристаллу и покрывают в том числе зону GPU, но именованного «датчика видеокарты» среди них нет.
Поэтому я сделал гибридную архитектуру. Температуру процессора ThermalBar читает нативно через IOKit — это работает всегда и без зависимостей. А температуру GPU и мощность берёт из лёгкого вспомогательного процесса с открытым кодом (macmon), который поднимается фоном и отдаёт эти данные по локальному адресу. Если вспомогательный модуль не запущен, приложение просто скрывает GPU и ватты, а температура процессора продолжает работать.
Получилась честная схема: ядро функциональности работает само по себе на голом системном API, а расширенные метрики подключаются опционально.
Установка в одну команду
Я специально сделал установку максимально простой. Никаких сборок вручную, никаких танцев с зависимостями:
git clone https://github.com/evilork/thermalbar.git cd thermalbar ./install.sh
Установщик сам соберёт приложение, положит его в папку «Программы» и настроит автозапуск при входе в систему. Температуры появятся в строке меню через пару секунд. Никакой настройки не требуется — всё работает из коробки.
Кому это нужно
В первую очередь — разработчикам, которые компилируют тяжёлые проекты и видят, как греется машина. Видеомонтажёрам, нагружающим GPU. ML-инженерам, обучающим модели на Apple Silicon. Геймерам. И вообще всем, у кого MacBook время от времени становится горячим, и кто хочет понять, что именно его греет — но без установки громоздкого пакета мониторинга.
Открытый код
ThermalBar полностью бесплатный, с открытым исходным кодом под лицензией MIT. Это не демо и не триал — приложение бесплатное навсегда, а код можно посмотреть, форкнуть и улучшить.
По сути это бесплатный нативный аналог iStat Menus, но заточенный под одну задачу — температуру, и решающий её без лишнего веса.
Репозиторий: thermalbar
Если приложение оказалось полезным — звезда на GitHub помогает другим его найти. А если найдёте баг или захотите добавить функцию — issues и pull requests открыты.
macOS, Apple Silicon, разработка, Swift, open source, MacBook, температура, мониторинг, программирование, M4