Мне нужно выполнить определенную команду, если мой ноутбук перегревается (например, отправить сигнал 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); };
Вам не придется запускать больше демонов, чем уже запущено, но вы по-прежнему сможете закрывать любые программы по своему усмотрению.