监控系统运行状态并生成日志的批处理

     公司有一个服务器监控的需求,需要监控上百台服务器的资源占用情况,包括CPU使用率,内存占用,硬盘空闲空间大小,网络连接速度等。

     初步技术方案为:使用批处理生成系统的资源情况日志,利用计划任务程序每隔5分钟生成日志,然后利用Logstash进行日志采集到管理服务器上,用kibana进行分析与呈现。

  程序流程:建立文件目录,分别取到CPU占用率,内存,C盘大小,网络连接等值,然后写入日志文件。

     批处理如下:

  1 @echo off
  2 ::获取年月日
  3 set year=%date:~0,4%
  4 set month=%date:~5,2%
  5 set day=%date:~8,2%
  6 
  7 rem 初始化常量
  8 set batPath=d:SysStatus
  9 set logPath=d:SysStatuslog
 10 set batName=RecordSysStatus.bat
 11 set host=www.baidu.com
 12 
 13 ::定义变量
 14 rem cpu使用率
 15 set /a cpu=0
 16 rem  物理内存总量
 17 set memPhysicalTotal=sf
 18 rem  可用物理内存
 19 set memAvailable=ds
 20 rem C盘剩余
 21 set Cfreespace=0
 22 rem C盘总空间
 23 set Csize=0
 24 rem 最短
 25 set netMin=0ms
 26 rem 最长
 27 set netMax=0ms
 28 rem 平均
 29 set netAva=0ms
 30 rem 进程
 31 set processlist=list
 32 
 33 ::创建目录和复制文件
 34 if not exist %batPath% md %batPath%
 35 if not exist %logPath% md %logPath%
 36 if not exist %logPath%\%year%-%month% md %logPath%%year%-%month%
 37 if not exist %batPath%\%batName% copy %~0 %batPath%
 38 set file=%logPath%\%year%-%month%\%year%%month%%day%.txt
 39 
 40 ::获取cpu使用率
 41 for /f  %%a in ('wmic cpu get LoadPercentage ') do (
 42 if not "%%a"=="LoadPercentage" set /a cpu=%%a 
 43 )
 44 
 45 rem 取内存数据
 46 for /f "tokens=2"   %%a  in ('systeminfo ^| findstr 物理内存总量') do (
 47 set memPhysicalTotal=%%a
 48 )
 49 set memPhysicalTotal=%memPhysicalTotal:,=%
 50 
 51 for /f "tokens=2"   %%a in ('systeminfo ^| findstr 可用的物理内存') do (
 52 set memAvailable=%%a
 53 )
 54 set memAvailable=%memAvailable:,=%
 55 
 56 rem 获得C盘剩余空间
 57 for /f %%a in ('wmic LogicalDisk where "DeviceID='C:'" get freespace') do (
 58 if  %%a gtr 0  set  Cfreespace=%%a
 59 )
 60 
 61 rem 获得C盘总空间
 62 for /f %%a in ('wmic LogicalDisk where "DeviceID='C:'" get Size') do (
 63 if  %%a gtr 0  set  Csize=%%a
 64 )
 65 
 66 rem 将byte表示的容量换算成以G表示的容量
 67 @echo off&setlocal enabledelayedexpansion
 68 call:division %Cfreespace% 1073741824 CGfree 1
 69 call:division %Csize% 1073741824 CGsize 1
 70 
 71 rem 计算百分比
 72 call:division %Cfreespace%00 %Csize% CfreePercent 1
 73 call:division %memAvailable%00 %memPhysicalTotal% memAvaiPercent 1
 74 
 75 
 76 rem 计算网络连接速度,ping host
 77 for /f "tokens=2,4,6 delims=,= " %%a in ('ping %host% ^| findstr 最长') do (
 78 ::echo 连接速度:最短:%%a 最长:%%b平均:%%c
 79 set netAva=%%c
 80 set netMax=%%b
 81 set netMin=%%a
 82 )
 83 
 84 rem 占用内存超100M进程
 85 setlocal EnableDelayedExpansion    
 86 set processlist=[
 87 for /f "skip=1tokens=2,6" %%a in ('wmic process where  "WorkingSetSize>100090688"  list brief ') do (
 88 set processlist=!processlist!{"Name":"%%a","WorkingSetSize":%%b},
 89 )
 90 set processlist=%processlist%]
 91 
 92 
 93 
 94 rem 输出到日志文件
 95 echo %date:~0,11%%time:~0,8% CPU使用率:%cpu%%% 可用内存:%memAvailable%M 内存总量:%memPhysicalTotal%M 内存可用率:%memAvaiPercent:~1,4%%% C盘可用:%CGfree%G C盘容量:%CGsize%G C盘可用率:%CfreePercent%%% 网络连接速度:最短:%netMin% 最长:%netMax% 平均:%netAva% 超100M进程:%processlist% >> %file%
 96 
 97 exit
 98 
 99 
100 
101 rem 除法运算,调用方法为call:division [除数] [被除数] [商] [精确位数] 如:call:division 12 234 quot 3
102 :division
103 setlocal
104 set str1=%1
105 set str2=%2
106 if "%~4" neq "" set u=%4
107 for %%i in (str1 str2) do if "!%%i:~,1!" == "-" set /a d+=1
108 if "%d%" == "1" (set d=-) else set "d="
109 set l=00000000&for /l %%i in (1 1 7) do set "l=!l!!l!"
110 set "var=4096 2048 1024 512 256 128 64 32 16 8 4 2 1"
111 for /l %%i in (1 1 2) do (
112     set "str%%i=!str%%i:-=!"
113     set /a "n=str%%i_2=0"
114     for %%a in (!str%%i:.^= !) do (
115         set /a n+=1
116         set s=s%%a&set str%%i_!n!=0
117         for %%b in (%var%) do if "!S:~%%b!" neq "" set/a str%%i_!n!+=%%b&set "S=!S:~%%b!"
118         set /a len%%i+=str%%i_!n!
119     )
120         set str%%i=!str%%i:.=!
121 )
122 if !str1_2! gtr !str2_2! (set /a len2+=str1_2-str2_2) else set /a len1+=str2_2-str1_2
123 for /l %%i in (1 1 2) do (
124     set str%%i=!str%%i!!l!
125     for %%j in (!len%%i!) do set " str%%i=!str%%i:~,%%j!"
126 )
127 for /f "tokens=* delims=0" %%i in ("!str2!") do set s=%%i&set "str2=0%%i"
128 set len2=1
129 for %%j in (%var%) do if "!S:~%%j!" neq "" set/a len2+=%%j&set "S=!S:~%%j!"
130 set /a len=len2+1
131 if !len1! lss !len2! set len1=!len2!&set "str1=!l:~-%len2%,-%len1%!!str1!"
132 set /a len1+=u&set str1=0!str1!!l:~,%u%!
133 set str=!str1:~,%len2%!
134 set "i=0000000!str2!"&set /a Len_i=Len2+7
135 for /l %%i in (1 1 9) do (
136     set "T=0"
137     for /l %%j in (8 8 !Len_i!) do (
138         set /a "T=1!i:~-%%j,8!*%%i+T"
139         set Num%%i=!T:~-8!!Num%%i!&set /a "T=!T:~,-8!-%%i"
140     )
141     set Num%%i=!T!!Num%%i!
142     set "Num%%i=0000000!Num%%i:~-%Len%!"
143 )
144 for /L %%a in (!len2! 1 !Len1!) do (
145     set "str=!L!!str!!str1:~%%a,1!"
146     set "str=!str:~-%Len%!"
147     if "!str!" geq "!str2!" (
148        set M=1&set i=0000000!str!
149        for /l %%i in (2 1 9) do if "!i!" geq "!Num%%i!" set "M=%%i"
150            set sun=!sun!!M!&set str=&set T=0
151            for %%i in (!M!) do (
152                for /l %%j in (8 8 !Len_i!) do (
153                    set /a "T=3!i:~-%%j,8!-1!Num%%i:~-%%j,8!-!T:~,1!%%2"
154                    set "str=!T:~1!!str!"
155                )
156            )
157     ) else set sun=!sun!0
158 )
159 if defined u if "%u%" gtr "0" set sun=!sun:~,-%u%!.!sun:~-%u%!
160 endlocal&set %3=%d%%sun%
原文地址:https://www.cnblogs.com/jinfang134/p/4459386.html