找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26041|回复: 4

[系统相关] bat批处理,能否检测sqlservr.exe这个进程,占用cpu如果超过40%,就执行某个代码。

[复制链接]
发表于 2012-8-26 13:18:03 | 显示全部楼层 |阅读模式
本帖最后由 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%,就可以
 楼主| 发表于 2012-8-26 14:09:08 | 显示全部楼层
问题基本解决了。。。
  1. 记录cpu利用率,如果cpu利用率超过40%重启mssqlserver
  2. @echo on
  3. set DstFile=C:\cpu.log
  4. set Services=mssqlserver
  5. if not exist %DstFile% (
  6.   type nul>"%DstFile%"
  7. )
  8. >"%DstFile%" echo %date% %time%
  9. for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Processor get PercentProcessorTime /value
  10. ^| findstr "PercentProcessorTime"') do (
  11.   set CPUUsage=%%a  
  12. )
  13. if %CPUUsage% geq 40 (
  14.     net stop %Services%
  15.     >>"%DstFile%" echo %ERRORLEVEL%
  16.     net start %Services%
  17.     >>"%DstFile%" echo %ERRORLEVEL%
  18. )

  19. for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Memory get * /value
  20. ^| findstr "AvailableBytes"') do (
  21.   set FreeMem=%%a
  22. )

  23. >>"%DstFile%" echo CPU使用率:%CPUUsage%%%
  24. >>"%DstFile%" echo 可用内存:%FreeMem%

  25. pause
复制代码
 楼主| 发表于 2012-8-26 14:09:50 | 显示全部楼层
本帖最后由 ygqiang 于 2012-8-26 16:18 编辑

修改成自己需要的代码是
  1. @echo off
  2. rem 记录cpu利用率,如果cpu利用率超过40%重启mssqlserver

  3. :aaa

  4. @echo off
  5. if "%1" == "h" goto begin
  6. mshta vbscript:createobject("wscript.shell").run("%~fs0 h",0)(window.close)&&exit
  7. :begin
  8. rem 下边开始写批处代码了(适合全自动场合)

  9. @echo on
  10. set DstFile=C:\cpu.log
  11. set Services=mssqlserver
  12. if not exist %DstFile% (
  13.   type nul>"%DstFile%"
  14. )
  15. >>"%DstFile%" echo %date% %time%

  16. for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Processor get PercentProcessorTime /value
  17. ^| findstr "PercentProcessorTime"') do (
  18.   set CPUUsage=%%a  
  19. )
  20. if %CPUUsage% geq 40 (
  21.     net stop %Services%
  22.     1>>"%DstFile%" echo %ERRORLEVEL%
  23.     net start %Services%
  24.     1>>"%DstFile%" echo %ERRORLEVEL%
  25. )

  26. for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Memory get * /value
  27. ^| findstr "AvailableBytes"') do (
  28.   set FreeMem=%%a
  29. )

  30. >>"%DstFile%" echo CPU使用率:%CPUUsage%%%
  31. 11>>"%DstFile%" echo 可用内存:%FreeMem%

  32. ping 127.0.0.1 -n 10 >nul 2>nul

  33. goto :aaa
复制代码
 楼主| 发表于 2012-8-26 14:25:36 | 显示全部楼层
本帖最后由 ygqiang 于 2012-8-26 16:51 编辑

测试代码:
  1. @echo off
  2. rem 记录cpu利用率,如果cpu利用率超过40%重启mssqlserver

  3. @echo off
  4. if "%1" == "h" goto begin
  5. mshta vbscript:createobject("wscript.shell").run("%~fs0 h",0)(window.close)&&exit
  6. :begin
  7. rem 下边开始写批处代码了(适合全自动场合)

  8. ping 127.0.0.1 -n 240 >nul 2>nul


  9. :begin1

  10. @echo off
  11. if "%1" == "h" goto begin
  12. mshta vbscript:createobject("wscript.shell").run("%~fs0 h",0)(window.close)&&exit
  13. :begin
  14. rem 下边开始写批处代码了(适合全自动场合)

  15. set Services1=mssqlserver

  16. for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_Processor get PercentProcessorTime /value
  17. ^| findstr "PercentProcessorTime"') do (
  18.   set CPUUsage=%%a  
  19. )

  20. if %CPUUsage% geq 40 (
  21.     net stop %Services1%
  22.     ping 127.0.0.1 -n 1 >nul 2>nul
  23.     net start %Services1%
  24.    
  25. )


  26. ping 127.0.0.1 -n 10 >nul 2>nul

  27. goto :begin1

  28. exit





  29. taskkill /f /im  sqlservr.exe
  30. taskkill /f /im  sqlmangr.exe

  31. "C:\SQL2KSP4\x86\binn\sqlservr.exe"
  32. "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqlmangr.exe"  /n
复制代码
不过这个代码,只能检测所有进程cpu占有率的总和。

bat能否实现:检测sqlservr.exe  这个进程,占用cpu超过40%  呢?
 楼主| 发表于 2012-8-27 08:55:03 | 显示全部楼层
本帖最后由 ygqiang 于 2012-8-29 17:51 编辑

vbs获取各个进程的CPU使用率.vbs

代码如下:
  1. for each Process in GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
  2.     WScript.echo Process.name & " " & CPUUSage(Process.Handle) & " %"
  3. Next

  4. Function CPUUSage( ProcID )
  5.     On Error Resume Next
  6.     Set objService = GetObject("Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")

  7.     For Each objInstance1 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
  8.         N1 = objInstance1.PercentProcessorTime
  9.         D1 = objInstance1.TimeStamp_Sys100NS
  10.         Exit For
  11.     Next

  12.     For Each perf_instance2 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
  13.         N2 = perf_instance2.PercentProcessorTime
  14.         D2 = perf_instance2.TimeStamp_Sys100NS
  15.         Exit For
  16.     Next

  17.     ' CounterType - PERF_100NSEC_TIMER_INV
  18.     ' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100
  19.     Nd = (N2 - N1)
  20.     Dd = (D2-D1)
  21.     PercentProcessorTime = ( (Nd/Dd))  * 100
  22.     CPUUSage = Round(PercentProcessorTime ,0)
  23. End Function
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 14:15 , Processed in 0.011667 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表