vmstatとかのstat系コマンドに時間を追加して出力する

one liner で書くと (コマンドは vmstat 3)


$ perl -e 'open $cmd,"vmstat 3|";while(<$cmd>){print localtime()." $_"}'
Thu Dec 18 01:46:22 2008 procs memory page disk faults cpu
Thu Dec 18 01:46:22 2008 r b w avm fre flt re pi po fr sr tw0 in sy cs us sy id
Thu Dec 18 01:46:22 2008 0 9 0 570636 551468 302 0 0 0 222 0 0 119 138 303 -27 -9 136
Thu Dec 18 01:46:26 2008 1 9 1 528772 586448 8850 0 1 0 1108 0 8 1403 14513 2921 33 8 60
Thu Dec 18 01:46:29 2008 0 8 0 489352 602160 5760 0 1 0 6599 0 4 1328
...

時間の出力を整形するなら (コマンドは ping localhost)


$ perl -e 'use POSIX;open $cmd,"ping localhost|";while(<$cmd>){print strftime("%Y/%m/%d %H:%M:%S",localtime)." $_"}'
2008/12/18 01:49:48 PING localhost (127.0.0.1): 56 data bytes
2008/12/18 01:49:48 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.081 ms
2008/12/18 01:49:49 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.056 ms
2008/12/18 01:49:50 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.056 ms
2008/12/18 01:49:51 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.056 ms
2008/12/18 01:49:52 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.056 ms
2008/12/18 01:49:53 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.042 ms

<2009/3/27 追記 --start>
-Mオプションのほうがスマートですね。。。


$ perl -MPOSIX -e 'open $cmd,"fsstat zfs 1 |";while(<$cmd>){print strftime("%H:%M:%S",localtime).$_;}'
02:34:18 new name name attr attr lookup rddir read read write write
02:34:18 file remov chng get set ops ops ops bytes ops bytes
02:34:18 321K 77.0K 21.1K 48.3M 160K 192M 348K 17.1M 103G 4.82M 45.9G zfs
02:34:19 0 0 0 3 0 5 0 1 125 1 276 zfs
02:34:20 0 0 0 0 0 0 0 0 0 1 132 zfs
02:34:21 0 0 0 0 0 0 0 0 0 1 132 zfs
02:34:22 0 0 0 0 0 0 0 0 0 1 132 zfs
...

<2009/3/27 追記 --end>

実行コマンドは、open関数の第二引数 のところなので、iostat,netstat,とか何でもよいです。
sarの結果には時間が入ってくれるのでよいですが、vmstatの結果をファイルに落として、後でグラフを作るときのために時間も出力させておきましょう。


#!/usr/local/bin/perl

use strict;
use warnings;
use POSIX qw/strftime/;

open my $cmd, "vmstat 3|" or die "fork error\n";
while(<$cmd>){

## フィルタリングとかするならここ

print strftime("%Y/%m/%d %H:%M:%S",localtime)." $_";
}

__END__