MRTG用uptimeライブラリ

※ このプログラムはFreeBSD依存である。 依存内容については、下記参照。
※ 追記: Linux対応のコードも掲載。

MRTGは、 snmpから取得するデータ以外にも、 決まったフォーマットでデータを渡せば、それをグラフ化することができる。

フォーマットは、1行にひとつずつの値が4つ。

ここでuptimeやhostnameは、 MRTGがそれを文字列としてそのまま表示するだけなので正確である必要はないが、 これを正しく(snmpから得た場合と同じ書式に)出力するための、 /bin/sh用ライブラリ"uptime.shlib"を書いた。

#!/bin/sh
#
# uptime.shlib
#
# This program suits for FreeBSD.
#
# uptimestr() converts a number of seconds into 'uptime' string.
# uptime_in_sec() gets uptime in seconds.
#
# So typical usage is
#    . this_library_file
#    uptimestr $(uptime_in_sec)
#
# Written by KANAI Makoto <kanai@nadmin.org>

uptimestr () {
    sec=$1
    day=$(( $sec / 86400 ))
    sec=$(( $sec - $day * 86400 ))
    hour=$(( $sec / 3600 ))
    sec=$(( $sec - $hour * 3600 ))
    min=$(( $sec / 60 ))
    sec=$(( $sec - $min * 60 ))
    case $hour in ??) ;; ?) hour="0$hour" ;; esac
    case $min in ??) ;; ?) min="0$min" ;; esac
    case $sec in ??) ;; ?) sec="0$sec" ;; esac
    case $day in
      0) echo "$hour:$min:$sec" ;;
      1) echo "$day day, $hour:$min:$sec" ;;
      *) echo "$day days, $hour:$min:$sec" ;;
    esac
}
 
uptime_in_sec () {
    IFS=' ,'
    set $(sysctl -n kern.boottime)
    echo $(( $(date +%s) - $4 ))
}

これを使った実例は、 こちらのCPU温度観察の仕方を参照のこと。

FreeBSD依存内容

  1. shellのsyntaxで、$(command)型のcommand substitutionと、 $((expression))型のarithmetic expansionを使っていること。 これらは、bashを使うか、 あるいは`command`, `expr expression`に置き換えれば、 他のシステムでも有効。
  2. kernel変数kern.boottimeからOS起動時刻を得ていること。

Linux対応 uptime_in_sec

上記uptime.shlibのうち、 uptime_in_secを次のコードに置き換えれば、 Linux対応になる。

uptime_in_sec () {
    IFS=' .'
    set $(cat /proc/uptime)
    echo $1
}

Presented by kanai@nadmin.org
Jan. 8, 2002
Top