※ このプログラムは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温度観察の仕方を参照のこと。
上記uptime.shlibのうち、 uptime_in_secを次のコードに置き換えれば、 Linux対応になる。
uptime_in_sec () {
IFS=' .'
set $(cat /proc/uptime)
echo $1
}