Команда запуска, когда температура превышает пороговое значение, без демона

Мне нужно запустить определенную команду, если мой ноутбук становится слишком горячим (например, отправьте сигнал STOP в Firefox или Virtualbox, чтобы я не смог отключить мой ноутбук и повредить мои жесткие диски).

Я могу легко написать программу, которая бесконечно петляет, периодически проверяя температуру. Ответ этого вопроса использует этот подход.

Тем не менее, я хотел бы избежать запуска моего собственного демона и вместо этого привязать свою программу к существующему. Например, я вижу в своем syslog:

5 мая 02:52:27 myhostname kernel: [9141.022262] intel ips 0000: 00: 1f.6: предел MCP превышен: средняя температура 9276, предел 9000

Таким образом, в моей машине уже проверяется температура, которая срабатывает в зависимости от состояния (например, сообщение о предупреждении журнала, когда температура превышает 9000). Другим примером является то, что вентилятор ускоряется в зависимости от той же температуры.

Как я могу прикрепить свою программу к этому существующему коду на моей машине? Изменено ли изменение скорости драйвера вентилятора и предупреждение о температуре ядра от одного и того же кода? Как я могу это узнать?

Вам придется запустить какой-то демон, который следит за такими вещами. Аппаратные датчики – это просто инертные источники данных и, как правило, сами по себе не могут выполнять свои действия.

Если вы просто хотите выйти из написания собственного кода, вы можете изучить установку collectd-sensors (ваш дистрибутив может назвать это чем-то другим), который сохранит историю температур. После того, как вы сконфигурируете collectd для отслеживания данных о температуре, вы сможете настроить уведомление коллектора для такого рода событий.

Как я могу прикрепить свою программу к этому коду?

Этот результат выводится из ядра, поэтому вы можете написать модуль ядра для этого или если информация не доступна глобально, патч к существующему.

Демоны WRT, которые у вас уже есть, вы можете использовать cron и проверять это каждую минуту или около того.

Если вы хотите, чтобы степень детализации была более тонкой, чем минуты, вам нужно либо написать свой собственный цикл, либо найти инструмент, который это делает уже – некоторые мониторы системы GUI могут позволить вам настраивать аварийные сигналы, которые могут запускать произвольный процесс (я замечаю gkrellm это не так, и трудно сказать, просто conky ).

Это требует, чтобы вы были уверены, что триггер для вашего Firefox / Virtualbox будет той же самой температурой, которая запускает сообщение в ваши журналы и также готова запустить syslog-ng.

syslog-ng может быть настроен для запуска произвольного кода, инициированного сообщением, отправленным в журнал, из конкретной программы или с конкретным содержимым.

В вашем syslog-ng.conf вы добавите новое место назначения:

 destination d_high_temp { program("/path/to/OPs/temperature_script"); }; 

а также новый фильтр для

 filter f_high_temp { match("MCP limit exceeded" value("MESSAGE")); }; 

И наконец

 log { source(src); filter(f_high_temp); destination(d_high_temp); }; 

У вас не будет больше демонов, чем вы уже есть, но все равно сможете отключить любые программы, которые вам нравятся.

Кажется, что событие DBUS или ACPI было бы местом для фиксации на этих «событиях» и запускать команду, чтобы делать то, что вы хотите. Я показываю метод для этого, используя dbus-monitor который может быть адаптирован для «улавливания» этих событий, а затем запускает ваш скрипт.

Взгляните на мой ответ на этот U & L Q & A под заголовком: Can libnotify можно использовать для выполнения сценария?