Mac OS Xには/procが無いのでsysctl使う

Linuxにはprocfsという"/proc"以下にシステム情報をファイルで配置してくれる仮想ファイルシステムがあり、CPUやメモリやプロセスその他もろもろの情報を調べるときに重宝します。

一方、Mac OSもといDarwinは、BSD系をベースにしており、またSUSによるUNIX認定を受けていますが、procfsは無いんですね。どうもprocfsはSUSの要件に入っていないようです。

もっとも、procfsが無くても、CPUのコア数とかメモリ容量とか調べるぐらいなら、アップルメニューから「このMacについて」を押せば概要が見れますし、もっと見たければ「詳しい情報...」を押せばその名の通り詳しい情報が出ますし、さらにもっと見たければ「システムレポート」を押せば「システム情報」というアプリが起動してハードウェアの詳細情報を全部見れます。システム情報アプリ(System Information.app)は、SpotlightとかAlfredで"sys"とでも入れれば出てくるので、起動はそれ程面倒ではないし、なにより情報が非常に見やすいです。

が、「いやGUIとかないでしょ」という人とか、「プログラムで取得したいんだが」みたいな需要は少なからずあると思うんですよね。なのに"/proc"が無い……この絶望感。

ということで少しググってみると、なんてことはない、普通にsysctlコマンドで取れることが判明しました。sysctl(8)自体はLinuxにもありますが、システムパラメータを変更するためのコマンドだと思ってた上、カーネルパラメータの変更は普通にprocfsで出来るので使ったことが無かったのですが*1、単に情報を取得することも出来たのですね。

このsysctlですが、Management Information Base(MIB)とかいう規格*2に準拠しているようで、つまるところツリー構造で情報が管理されているようです。

Macではハードウェア関係の情報は"hw"というツリーに入っているので、そこからメモリ容量とかを確認できます。"kern"ではカーネルのバージョン情報とかも取得できます。

$ sysctl hw | head
hw.ncpu: 4
hw.byteorder: 1234
hw.memsize: 8589934592
hw.activecpu: 4
hw.physicalcpu: 2
hw.physicalcpu_max: 2
hw.logicalcpu: 4
hw.logicalcpu_max: 4
hw.cputype: 7
hw.cpusubtype: 4
$ sysctl -n hw.memsize
8589934592
$ sysctl kern.version
kern.version: Darwin Kernel Version 13.1.0: Wed Apr  2 23:52:02 PDT 2014; root:xnu-2422.92.1~2/RELEASE_X86_64

これは楽しい!

ちなみに、システム情報アプリレベルの粒度の情報はsystem_profilerコマンドで取得できます。ただ、取得にちょっと時間がかかるのがネックなので、詳細な情報を必要としないならsysctlで十分だと思います。

*1:Linuxのsysctlはprocfsがベースみたいなのでsysctl使う必要性はやっぱり無い

*2:ネットワーク機器とかの情報管理で使われているらしい