标题: [系统相关] bat批处理,能否检测sqlservr.exe这个进程,占用cpu如果超过40%,就执行某个代码。 [打印本页]
作者: ygqiang 时间: 2012-8-26 13:18 标题: bat批处理,能否检测sqlservr.exe这个进程,占用cpu如果超过40%,就执行某个代码。
本帖最后由 ygqiang 于 2012-8-26 13:35 编辑
bat批处理,能否检测sqlservr.exe这个进程,占用cpu如果超过40%,就执行某个代码。
我是xp系统下
http://bathome.l3.wuyou.com/thread-12760-1-1.html
KernelModeTime和UserModeTime只是进程创建以来占用CPU的总时间,你要取瞬间的CPU占用率,可以先取一次,再Sleep一秒,再取一次,将两次的值相减,即可得到这一秒里的CPU的占用率。
这个思路不错。
我不需要精确的,3秒以内,cpu占用超过40%,就可以
作者: ygqiang 时间: 2012-8-26 14:09
问题基本解决了。。。- 记录cpu利用率,如果cpu利用率超过40%重启mssqlserver
- @echo on
- set DstFile=C:\cpu.log
- set Services=mssqlserver
- if not exist %DstFile% (
- type nul>"%DstFile%"
- )
- >"%DstFile%" echo %date% %time%
- for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Processor get PercentProcessorTime /value
- ^| findstr "PercentProcessorTime"') do (
- set CPUUsage=%%a
- )
- if %CPUUsage% geq 40 (
- net stop %Services%
- >>"%DstFile%" echo %ERRORLEVEL%
- net start %Services%
- >>"%DstFile%" echo %ERRORLEVEL%
- )
-
- for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Memory get * /value
- ^| findstr "AvailableBytes"') do (
- set FreeMem=%%a
- )
-
- >>"%DstFile%" echo CPU使用率:%CPUUsage%%%
- >>"%DstFile%" echo 可用内存:%FreeMem%
-
- pause
复制代码
作者: ygqiang 时间: 2012-8-26 14:09
本帖最后由 ygqiang 于 2012-8-26 16:18 编辑
修改成自己需要的代码是- @echo off
- rem 记录cpu利用率,如果cpu利用率超过40%重启mssqlserver
-
- :aaa
-
- @echo off
- if "%1" == "h" goto begin
- mshta vbscript:createobject("wscript.shell").run("%~fs0 h",0)(window.close)&&exit
- :begin
- rem 下边开始写批处代码了(适合全自动场合)
-
- @echo on
- set DstFile=C:\cpu.log
- set Services=mssqlserver
- if not exist %DstFile% (
- type nul>"%DstFile%"
- )
- >>"%DstFile%" echo %date% %time%
-
- for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Processor get PercentProcessorTime /value
- ^| findstr "PercentProcessorTime"') do (
- set CPUUsage=%%a
- )
- if %CPUUsage% geq 40 (
- net stop %Services%
- 1>>"%DstFile%" echo %ERRORLEVEL%
- net start %Services%
- 1>>"%DstFile%" echo %ERRORLEVEL%
- )
-
- for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Memory get * /value
- ^| findstr "AvailableBytes"') do (
- set FreeMem=%%a
- )
-
- >>"%DstFile%" echo CPU使用率:%CPUUsage%%%
- 11>>"%DstFile%" echo 可用内存:%FreeMem%
-
- ping 127.0.0.1 -n 10 >nul 2>nul
-
- goto :aaa
复制代码
作者: ygqiang 时间: 2012-8-26 14:25
本帖最后由 ygqiang 于 2012-8-26 16:51 编辑
测试代码:- @echo off
- rem 记录cpu利用率,如果cpu利用率超过40%重启mssqlserver
-
- @echo off
- if "%1" == "h" goto begin
- mshta vbscript:createobject("wscript.shell").run("%~fs0 h",0)(window.close)&&exit
- :begin
- rem 下边开始写批处代码了(适合全自动场合)
-
- ping 127.0.0.1 -n 240 >nul 2>nul
-
-
- :begin1
-
- @echo off
- if "%1" == "h" goto begin
- mshta vbscript:createobject("wscript.shell").run("%~fs0 h",0)(window.close)&&exit
- :begin
- rem 下边开始写批处代码了(适合全自动场合)
-
- set Services1=mssqlserver
-
- for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Processor get PercentProcessorTime /value
- ^| findstr "PercentProcessorTime"') do (
- set CPUUsage=%%a
- )
-
- if %CPUUsage% geq 40 (
- net stop %Services1%
- ping 127.0.0.1 -n 1 >nul 2>nul
- net start %Services1%
-
- )
-
-
- ping 127.0.0.1 -n 10 >nul 2>nul
-
- goto :begin1
-
- exit
-
-
-
-
-
- taskkill /f /im sqlservr.exe
- taskkill /f /im sqlmangr.exe
-
- "C:\SQL2KSP4\x86\binn\sqlservr.exe"
- "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqlmangr.exe" /n
复制代码
不过这个代码,只能检测所有进程cpu占有率的总和。
bat能否实现:检测sqlservr.exe 这个进程,占用cpu超过40% 呢?
作者: ygqiang 时间: 2012-8-27 08:55
本帖最后由 ygqiang 于 2012-8-29 17:51 编辑
vbs获取各个进程的CPU使用率.vbs
代码如下:- for each Process in GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
- WScript.echo Process.name & " " & CPUUSage(Process.Handle) & " %"
- Next
-
- Function CPUUSage( ProcID )
- On Error Resume Next
- Set objService = GetObject("Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")
-
- For Each objInstance1 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
- N1 = objInstance1.PercentProcessorTime
- D1 = objInstance1.TimeStamp_Sys100NS
- Exit For
- Next
-
- For Each perf_instance2 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
- N2 = perf_instance2.PercentProcessorTime
- D2 = perf_instance2.TimeStamp_Sys100NS
- Exit For
- Next
-
- ' CounterType - PERF_100NSEC_TIMER_INV
- ' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100
- Nd = (N2 - N1)
- Dd = (D2-D1)
- PercentProcessorTime = ( (Nd/Dd)) * 100
- CPUUSage = Round(PercentProcessorTime ,0)
- End Function
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |