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