MacでScreenのステータスライン(hardstatus)にCPU使用率&温度とメモリ使用率を表示させる

前回の続きです。結局の所コマンドラインから各種情報を表示させることができればbacktickを使ってステータスラインに情報が表示できます。

CPU使用率

参考
・ cpu usage


host_processor_info()関数を使うことでブートからのUser,System,Idle,NiceのCPUチック数が取得できます。ということである単位時間において、( User+System+Niceの増加分) / ( 全チック数の増加分 )*100 を求めればCPU使用率が求められる…と思います。ソースみた訳じゃないのではっきり言えませんがtopも理論的にはこうして求めているようです。といことで上記のサイトに載っているコードを参考にして作ったのがこれです。

まず.cpu.oldから前回起動時のチック数の情報を取得します。それから現在のCPUチック数を取得して、それらの差からCPU使用率を表示します。これを1秒おきに実行させるようにすれば CPU使用率がでます。

メモリ使用率

参考
・Macのシステムコール - Christopher-727の日記
・http://yasu2.prosou.nu/blog/2006/04/macos-x.html


Macのメモリは純粋に使用中or非使用中と分けられる訳ではなく、Wired,Acgtive,Inavtive,Freeの4つに分けられます。これに関してはこのページが分かりやすいと思います。まぁ、そういう訳なんですがとりあえずWiredとActiveが利用している割合をメモリ使用率として表示することにしました。上記2つのサイトを参考にして作ったのがこれです。

CPU温度

参考
・Temperature in Terminal | MacRumors Forums
・Temperature Monitor: Description


CPU温度の取得方法を見つけるのが一番苦労しました。検索してもppcなら見つかりますがIntelのがなかなか見つからず、XRGというオープンソースのリソースモニタから頑張ってその方法を見つけようとしましたがあえなく挫折。困っていましたが、最終的に上記のTemperature Monitorにコマンドラインから使えるtempmonitorが同胞されていることが分かりました。Temperature Monitorをダウンロードすると,TemperatureMonitor.app/Contents/MacOS/ に tempmonitor があります。ということでこれをbacktickで定期的に実行させればOK…といきたいところですが、一つ問題があります。それは、実行に1秒程かかってしまうことです(何してるんでしょうかね)。backtickはバックグラウンドで動作する訳ではないようで、backtickでプログラムを実行しているときscreenは入力を受けつけなくなってしまいます。これでは作業ができないので、次のようなプログラムを作ってみました。

まぁ、これくらいならシェルスクリプトで十分でしたね。

#!/bin/sh

awk '{print $1}' /Users/mfumi/.screen/.temp
/Users/mfumi/.screen/tempmonitor > .temp &

.tempというファイルから前回の温度情報を読みこんで表示、そのあとにバックグラウンドでtmpmonitorを実行しています。リアルタイムの温度ではないですが実用には十分だと思います。


----------------------------------------------------------------------------------------------
ということで.以上のソースをコンパイルして適当な場所(自分の場合は~/.screen)に置きます。.screenrcはこんな感じです。

hardstatus alwayslastline "%{= db} %-w%{=b dr}%n %t%{-}%+w %= [Mem:%0`%%] [CPU:%1`%% %2`C] [%3`] %y/%m/%d %c "
backtick 0 10 10 $HOME/.screen/memory
backtick 1 1 1   $HOME/.screen/cpu
backtick 2 5 5 $HOME/.screen/temperature
backtick 3 10 10 $HOME/.screen/battery.sh

こうなりました。


実際のところ値の正確さは分かりませんが、他のリソースモニタと比べてみて大きく違った値は出ていないので大丈夫だと思います。
(ところで、hardstatusでascii文字以外を表示させようとするとバグるんだよなぁ…(ver4.00.03)。今は修正されたみたい?)