cf). Software Design 2010/01号
!#/bin/sh vmstat 5 2 | tail -1 | awk '{print $4,$5,$6}'
service agent_mem { socket_type = stream protocol = tcp wait = no user = nobody server = Monitor/agent_mem.sh only_from = 127.0.0.1 disable = no }
php の場合、fopen() でもいけると思うのだが、明示的に sockopen() を使う。うむ、perlよりも楽だわこりゃ。
<?php /* -*-java-*- */ /** * モニタリングクライアント * */ $fp = fsockopen( 'localhost', 11001, $errno, $errmsg, 30 ); if ( !$fp ) { echo "Error: $errno - $errmsg \n"; } else { echo date('Y-m-d H:i:s'). "\t"; $stmt = fgets ( $fp, 128 ); if ( preg_match( "/([0-9]+) ([0-9]+) ([0-9]+)/", $stmt, $regs ) ) { $total = (int)$regs[1] + (int)$regs[2] + (int)$regs[3]; echo $regs[1]."\t".$regs[2]."\t".$regs[3]."\t".$total."\n"; } fclose( $fp ); }
こいつをモニターとして走らせっぱなしに出来るようにする。
<?php /* -*-java-*- */ /** * モニタリングクライアント * */ function mem_monitor ( $host, $port ) { $fp = fsockopen( $host, $port, $errno, $errmsg, 30 ); if ( !$fp ) { echo date('Y-m-d H:i:s'). "\t"; echo "Error: $errno - $errmsg \n"; } else { echo date('Y-m-d H:i:s'). "\t"; $stmt = fgets ( $fp, 128 ); if ( preg_match( "/([0-9]+) ([0-9]+) ([0-9]+)/", $stmt, $regs ) ) { $total = (int)$regs[1] + (int)$regs[2] + (int)$regs[3]; echo $regs[1]."\t".$regs[2]."\t".$regs[3]."\t".$total."\n"; } fclose( $fp ); } } while( 1 ) { mem_monitor( 'localhost', 11001 ); ob_flush(); flush(); sleep( 30 ); }