温度が閾値を超えたときにデーモンなしでコマンドを実行する

温度が閾値を超えたときにデーモンなしでコマンドを実行する

ラップトップが熱くなりすぎた場合、特定のコマンドを実行する必要があります (たとえば、ラップトップが突然シャットダウンしてハードディスクが損傷するのを防ぐために、Firefox または Virtualbox に STOP 信号を送信します)。

定期的に温度をチェックしながら無限にループするプログラムを簡単に作成できます。これ質問の回答ではこのアプローチが使用されています。

しかし、私は独自のデーモンを実行することを避け、代わりに既存のデーモンにプログラムを接続したいと思います。たとえば、syslog には次のように表示されます。

5月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これを1分ごとにチェックしてください。

分単位よりも細かい粒度が必要な場合は、独自のループを作成するか、既にこれを実行しているツールを見つける必要があります。一部の GUI システム モニターでは、任意のプロセスを実行できるアラームを構成できる場合があります (私はgkrellmそうではないことに気付きました。グーグルで検索しただけではわかりませんconky)。

答え3

DBUS または ACPI イベントは、これらの「イベント」を捕捉し、必要な操作を実行するためのコマンドを発行する場所のようです。dbus-monitorこれらのイベントを「キャッチ」してスクリプトを実行するように適応できる を使用した、これを行う方法を示します。

次のタイトルの U&L Q&A に対する私の回答をご覧ください: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); };

すでに実行しているデーモン以上のデーモンは実行されませんが、好きなプログラムをシャットダウンすることはできます。

関連情報