試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

cpufreqdのプロファイルを、一覧を見ながらGUIで手動変更

(2014/9/22)cpufreqdのプロファイル手動切り替え/モード切り替え用システムトレイツールをC言語のGTK+で作り直し」のツールを作成しているため、本記事の内容は古いものとなる。

cpufreqdデーモンのプロファイル(Governorの種類と、最低/最高クロックの組み合わせ)は、通常、「ルール」の設定により、自動的に切り替わることになっていて、この機能があることで、常時ondemand Governorにしておくことよりも高い省電力効果が得られ、その他のプラグインを利用することでも、システムを常に最適な状態にできる効果がある。→動的にCPUクロックや電圧を変更するcpufreqの概要とcpufreqdデーモンについて
しかし、ルールの設定だけではうまくいかなかったり、一時的に任意のプロファイルに変えたいといったこともあり、その作業は、

$ cpufreqd-get

でプロファイル一覧を確認した上で、マニュアルモードにして

$ cpufreqd-set manual

任意のプロファイルを指定し、

$ cpufreqd-set [プロファイル番号]

後で自動切り替えに戻す

$ cpufreqd-set dynamic

といった面倒なもの。
これをzenityを使ってGUIダイアログで行えるようなスクリプトを、試しに作ってみた。制約としては、

  • cpufreqd-getでは、現在、自動プロファイル切り替え(ダイナミックモード)になっているかどうかが取得できないため、ダイナミックモードになっている状態で起動させた場合、「ダイナミックモード」の項目を選択してOKするか、キャンセルするかのどちらかをする必要がある
  • 起動時に選択されているのは、cpufreqd-getでアクティブになっている印のあるものであり、ダイナミックモードの状態で起動しても、「ダイナミックモード」の項目は選択されない(理由は上に同じ)

という部分。また、一覧の取得は、cpufreqd-getの結果をもとにしているため、その書式に依存するところが大きい。

(2007/7/31)プロファイル名にスペースを含むことができるよう修正。変数名も幾つか修正。あと、注意点として、スクリプトは日本語を含むので、スクリプトエンコーディングUTF-8にしておくようにする、ということを追記しておく。
cpufreqd 2.2.1を入れてみたところ、cpufreqd-getの書式が変わっていることが判明したため、下のスクリプトは、バージョン2.1.1専用(それ以前のバージョンでも動作する可能性はあるが未確認)となる。

[任意]ファイル名: ~/bin/cpufreqd-set-2.1.1-zenity.pl

#! /usr/bin/perl -w

use strict;

my @PROFILE = ();
my $CNT = 1;
my $ACTIVE = -1;
my $CMDLINE = "";
my $OUTPUT = -1;

# cpufreqd-getの出力を1行ずつ解析
open IN, "cpufreqd-get |";
while (<IN>)
{
  if (/^Name \(#([0-9]+)\):\t(.+) (\*?)/)  # Name行
  {
    my ($no, $name, $mark) = ($1, $2, $3);
    if ($mark) { $ACTIVE = $no; }  # 現在アクティブなプロファイル番号
    $PROFILE[$CNT][0] = $name;
    if (<IN> =~ /\t([a-z]+)/)  # Governor行
    {
      $PROFILE[$CNT][1] = $1;
      if (<IN> =~ /([0-9]+)000$/)  # Min Freq行
      {
        $PROFILE[$CNT][2] = $1;
        if (<IN> =~ /([0-9]+)000$/)  # Max Freq行
        {
          $PROFILE[$CNT][3] = $1;
        }  # if (<IN> =~ /([0-9]+)000$/)
      }  # if (<IN> =~ /([0-9]+)000$/)
    }  # if (<IN> =~ /\t([a-z]+)/)
    $CNT++;
  }  # if (/^Name \(#([0-9]+)\):\t(.+) (\*?)/)
}  # while (<IN>)
close IN;

# アクティブなプロファイルが見つからないとエラーにする
if ($ACTIVE == -1)
{
  system "zenity --error --title 'エラー' --text 'アクティブなプロファイルが見つかりません\ncpufreqdの<span underline=\"double\">バージョン</span>、<span underline=\"double\">動作状態</span>、<span underline=\"double\">設定</span>を確認してください\n\nこのスクリプトは、cpufreqd <span foreground=\"darkred\" size=\"x-large\" weight=\"bold\">2.1.1</span>向けに書かれています'";
  exit 1;
}

# zenityのコマンド行を作る
$CMDLINE="zenity --list --title 'cpufreqdプロファイルの手動選択' --text 'プロファイルを選択してください' --width 500 --height 350  --radiolist --hide-column 2 --column '選択' --column dummy --column 'プロファイル名' --column 'Governor' --column '最低クロック' --column '最高クロック' false 'dynamic' 'ダイナミックモード' '動的に切り替え' '動的に切り替え' '動的に切り替え'";
for (my $i = 1; $i < $CNT; $i++)
{
  $CMDLINE = sprintf "%s '%s' '%s' '%s' '%s' '%s' '%s'",
                     $CMDLINE,
                     ($i == $ACTIVE) ? "true" : "false", $i,
                     $PROFILE[$i][0],
                     $PROFILE[$i][1],
                     $PROFILE[$i][2],
                     $PROFILE[$i][3];
}

# zenityを実行し、出力を取り出す
$OUTPUT = `$CMDLINE`;
if ($?) { exit 1; }  # キャンセルされた場合は終了

# dynamicモードに戻す場合以外は、一度manualモードを指定しておく必要がある
if ($OUTPUT ne "dynamic\n") { system "cpufreqd-set manual"; }

# 指定されたプロファイル(もしくはダイナミックモード)に切り替え
system sprintf "cpufreqd-set %s", $OUTPUT;

## [EOF] ##

使用したバージョン:

  • cpufreqd-2.1.1