書いたスクリプトのメモ。Linux上でvmstatを出力したログファイルの
CPUアイドル値だけの平均を計算して、CPU使用率として出力。
カレントディレクトリ内のvmstatログファイルを全て計算し結果をログとして出力。
exerb
http://exerb.sourceforge.jp/man/doc/tutorial.ja.html#0101
を使えばWindows上でも気軽に使えるので、こういうこまごま作業は楽。
でも、rubyっぽく書けていないなー。早くrubyっぽく書けるようになりたい。
未だにクラスとか良くわかっていないし。
-----------------------------------------------------------ここから #!/usr/local/bin/ruby STDOUT.sync = true #ディレクトリの中身を格納する @log = [] #処理をしたログファイル名を格納するインスタンス変数 @file_name = [] #平均値を格納するインスタンス変数 @cpu_avg = [] #保存されているディレクトリを検索します def get_dir #@log = gets.chomp @log = Dir.glob("*.*") end #ファイルの中身をチェックして、vmstatの結果が出力されているログファイルのみ名前を取得する def get_proc_file @log.each do |log| file = open(log) text = file.gets if text =~ /procs*/ @file_name << log else end file.close end end #取得したログファイルを順に平均値を計算し取得していく def cpu_avg @file_name.each do |name| last = [] file = open(name) while text = file.gets do first = text.gsub(/ */, ",") secound = first.sub(/,/, "") third = secound.split(/\s*,\s*/) if third[14] =~ /[0-9][0-9]*/ last << Integer(third[14]) else end end a = (last.length - 1) b = ((last.inject(0){|result, i| result + i }) - last[0]) test = (b.to_f / a.to_f) test = ((100 - test) * 100 ).round / 100.0 @cpu_avg << test file.close end end #結果を標準出力にするのかCSV形式にするのか判定 def print_pat pat = 0 puts "出力形式を選択してください。" puts "1:標準形式 2:CSV形式(番号で選択してください)" while pat !~ /[1..2]/ pat = gets.chomp if pat == "1" print_normal_log() elsif pat == "2" print_csv_log() else puts "入力した番号が間違っています。再度入力してください" pat = gets.chomp end end end #結果を標準出力でcpu_avg.logに書き込む def print_normal_log fh = open("cpu_avg.log","w") i = 0 puts "ただ今出力中・・・" for i in 0..(@file_name.length.to_i - 1) fh.print @file_name[i] fh.print "\n" fh.print @cpu_avg[i] fh.print "%" fh.print "\n\n" i += 1 end puts "出力が完了しました" fh.close end #結果をCSV形式でcpu_avg.logに書き込む def print_csv_log fh = open("cpu_avg.log","w") i = 0 puts "ただ今出力中・・・" fh.print "ファイル名,平均値\n" for i in 0..(@file_name.length.to_i - 1) fh.print @file_name[i] fh.print "," fh.print @cpu_avg[i] fh.print "%" fh.print "\n" i += 1 end puts "出力が完了しました" fh.close end #実行 get_dir() get_proc_file() cpu_avg() print_pat() ------------------------------------------------ここまで
追記:
予想以上に汚く見える・・・。