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

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

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

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

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

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

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

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

решение1

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

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

решение2

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

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

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

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

решение3

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

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

решение4

Для этого вам необходимо, чтобы триггером для 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); };

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

Связанный контент