2012年8月8日水曜日

LinuxのTOPコマンドの結果を整形するスクリプト

性能監視として、TOPコマンドで情報を集めたのはいいけど、どうやってCPU使用率の推移を見れば良いのだろうと考えて、スクリプトで好きなように加工するのが一番と判断したので作ってみた。
VBスクリプトです。

使い方は以下の様な感じで。
コマンドラインから実行します。
出力結果があるフォルダに、「Result.csv」というファイル名で加工した結果を出力します。

cscript このスクリプトのファイル名.vbs "TOPコマンドの出力結果があるフォルダの絶対パス"

加工した結果はこんな感じになります。
CSV形式で、左から時間、プロセスの所有者、プロセス状態、CPU使用率(%)、プロセス名です。

"07:40:02","root","S",53.0,"gzip"
"07:40:02","root","D", 5.1,"tar"
"07:40:02","root","S", 1.7,"pdflush"

これをExcelに取り込んで、グラフなんかに応用してみてください。
___________________________________

Option Explicit

Dim objFileSystem
Dim objResultFile
Dim strPathName
Dim strLineData
Dim strTime, strUserName, strProcessState, strCPU, strProcessName
Dim dblTotal
Dim intHeaderFlag

Const IN_FILE_NAME = "TOPコマンドの出力結果(ファイル名)"
Const ForReading = 1, ForWriting = 2, ForAppending = 8

'結果ファイルのフォルダ情報をコマンドライン引数から得る
strPathName = WScript.Arguments(0)

'FileSystemObjectの作成
Set objFileSystem = WScript.CreateObject("Scripting.FileSystemObject")

'入力ファイルを開く
Set objResultFile = objFileSystem.OpenTextFile(strPathName & "\" & IN_FILE_NAME, ForReading)

dblTotal = 0

'ファイルの最後まで読み込みを続ける
Do Until objResultFile.AtEndOfStream
strLineData = objResultFile.ReadLine
'時刻を取得する
If InStr(strLineData,"top - ") > 0 then
strTime = Mid(strLineData, 7, 8)
End If

'Header情報が見つかったら、データ解析のモードになる
If intHeaderFlag = 0 Then
'データ解析モードでなければここ
If InStr(strLineData,"PID") > 0 then
intHeaderFlag = 1
End If
Else
'データ解析モードならこっち
If Len(strLineData) > 0 Then
'CPU使用率が0%以上なら解析する。
If CDbl(Mid(strLineData, 42, 4)) > 0 Then
strUserName = Trim(Mid(strLineData, 7, 10))
strProcessState = Mid(strLineData, 40, 1)
strCPU = Mid(strLineData, 42, 4)
strProcessName = Trim(Mid(strLineData, 62, 19))
dblTotal = dblTotal + CDbl(strCPU)

'結果ファイルへ書き込み
Call WriteResultData

End If
Else
intHeaderFlag = 0

strCPU = CStr(dblTotal)
strProcessName = "Total"
Call WriteResultData
dblTotal = 0

End If

End if
Loop

objResultFile.Close
Set objResultFile = Nothing
Set objFileSystem = Nothing

'結果ファイルへ書き込む
Sub WriteResultData()
Dim objWriteFile

'追記モードでオープン
Set objWriteFile = objFileSystem.OpenTextFile(strPathName & "\" & "Result.csv", ForAppending, True)

objWriteFile.WriteLine Chr(34) & strTime & Chr(34) & "," & _
Chr(34) & strUserName & Chr(34) & "," & _
Chr(34) & strProcessState & Chr(34) & "," & _
strCPU & "," & Chr(34) & strProcessName & Chr(34)

objWriteFile.Close
Set objWriteFile = Nothing

End Sub

0 件のコメント:

コメントを投稿