この記事はLinux Advent Calendar 2014の2日目の記事です。
プログラムの中でロードアベレージとかメモリの空き容量を見るのにどうしようかなーと思っていて見つけたのがsysinfo(2)です。 使い方は至って単純でsysinfo構造体のアドレスをsysinfo(2)に渡せば情報が入ってくるのであとはご自由にという感じでいけます。
cだとこんな感じです。SI_LOAD_SHIFTは/usr/include/linux/sysinfo.hにて定義されています。
#include <stdio.h> #include <sys/sysinfo.h> #define LOAD_AVERAGE(x) x / (double)(1 << SI_LOAD_SHIFT) int main(int argc, char **argv) { struct sysinfo info = { 0 }; sysinfo(&info); printf("load average: 1min(%.3f) 5min(%.3f) 15min(%.3f)\n", LOAD_AVERAGE(info.loads[0]), LOAD_AVERAGE(info.loads[1]), LOAD_AVERAGE(info.loads[2])); printf("Total ram: %lu\n", info.totalram); printf("\tfreeram: %lu\n", info.freeram); printf("\tsharedram: %lu\n", info.sharedram); printf("\tbufferram %lu\n", info.bufferram); printf("\ttotalswap %lu\n", info.totalswap); printf("\tfreeswap %lu\n", info.freeswap); printf("number of processes: %u\n", info.procs); return 0; }
引数一個で使い方も単純なのでrubyとかpythonからも呼びやすいと思います。 rubyの場合はこんな感じですね。
#!/usr/bin/env ruby require 'dl/import' module M extend DL::Importer dlload "libc.so.6" extern('int sysinfo(struct sysinfo *)') Sysinfo = struct( ["long uptime", "unsigned long loads[3]", "unsigned long totalram", "unsigned long freeram", "unsigned long sharedram", "unsigned long bufferram", "unsigned long totalswap", "unsigned long freeswap", "unsigned short procs", "unsigned long totalhigh", "unsigned long freehigh", "unsigned int mem_unit", "char _f[20-2*sizeof(long)-sizeof(int)]"]) end sysinfo = M::Sysinfo.malloc e = M.sysinfo(sysinfo) if e == 0 puts("load average") 3.times { |i| sysinfo.loads[i]/ (1 << 16).to_f } end
あ、rubyだとsysinfoはgemがあったからそれを使う方が早いと思いますが(; ̄ェ ̄)
sysinfoだと/procのファイルを読んだりする必要がないので良さ気ですね。
サーバ/インフラ徹底攻略 (WEB+DB PRESS plus)
- 作者: 伊藤直也,片山暁雄,平山毅,舟崎健治,吉荒祐一,今井雄太,八木橋徹平,安川健太,宮下剛輔,田中慎司,久保達彦,道井俊介,飯田祐基,桑野章弘,松浦隼人,中村俊之,福永亘,杉山仁則,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/30
- メディア: 大型本
- この商品を含むブログ (3件) を見る