GNU Screen の hardstatus に CPU 使用率・温度・バッテリー情報を表示する


110805-0002.png

GNU Screen を Mac で使うときの話。iTerm2 が最新版で Lion のフルスクリーンモードに対応した。今まではバッテリー情報その他を iStat Menu で確認していたのだが、フルスクリーンモードではこれが見えない。不便だと思ってたら、やはり先人が何とかしてくれてました。

基本はこのサイトを参考に行ったのだが、メモリ使用率の点で問題発生。コードをコンパイルしてみると……

$ gcc show_memory_usage.c -o memory
$ ./memory
151.087952

メモリ使用率 151%!?! これはどう考えてもおかしい。コードを少し変えて、計算の元となった値を表示してみる。

$ ./memory
ratio:149.295425
wire:258358.000000
active:524380.000000
page:4096.000000
memory:2147483648.000000

アー、分かった。memory の値が 2GB になってる。この Mac は 4GB のメモリを積んでるんで、倍率も 2 倍出ちゃったのね。ググってみると情報が出てきた。

曰く、host_basic_info.memory_size は 4GB とかメモリ積んでるマシンじゃ動かないよ。sysctlbyname 使って hw.memsize を得なさい。」だそうだが、正直 C 言語には素人なのでよく分からん。グーグル先生の助けを借りて、コードを無理矢理追加してみた。

#include <sys/types.h>
#include <sys/sysctl.h>
#include <mach/host_info.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
    struct host_basic_info host;
    struct vm_statistics vm_info;
    mach_msg_type_number_t count;
    kern_return_t kr;
    vm_size_t pagesize;

    count = HOST_BASIC_INFO_COUNT;
    kr = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host, &count);

    count = HOST_VM_INFO_COUNT;
    kr = host_statistics(mach_host_self(),HOST_VM_INFO,(host_info_t)&vm_info,&count);
    kr = host_page_size(mach_host_self(),&pagesize);

    uint64_t memory_size;
    size_t len = sizeof(memory_size);

    sysctlbyname("hw.memsize", &memory_size, &len, NULL, 0);

    if(kr == KERN_SUCCESS)
        printf("%6.2lf\n",(((double)(vm_info.wire_count + vm_info.active_count)*pagesize)/memory_size)*100);
    return 0;
}
$ ./memory
74.85

何とかそれっぽい数字が出た。あとは .screenrc に設定を書き加えて終了。

hardstatus alwayslastline "%{= Gk} %-Lw%40L>%{b kg} %n %?%h%:%t%? %{-}%+Lw%-0120=%{b ky} メモリ %0`%% %{b kb}CPU %1`%% %{b kr}CPU温度 %2`℃ %{b kw}%3` %{b km}%l %{.b}%Y/%m/%d %C %A"
backtick 0 10 10 $HOME/.screen/memory
backtick 1 1 1 $HOME/.screen/cpu
backtick 2 5 5 $HOME/.screen/temperature.sh
backtick 3 10 10 $HOME/.screen/battery.sh

.screenrc の細かい設定は以前書いた記事を見てね。

コメントを残す