首页 文章

批处理文件,用于根据进程的CPU重新启动特定服务

提问于
浏览
0

我希望你可以帮助我,我已经尝试了几个小时的研究,但似乎无法随心所欲 .

我有一个进程,每天随机开始消耗50个CPU,我正在尝试创建一个批处理文件,它将在后台运行并重新启动服务,如果进程的CPU使用率超过50(修复问题) ) .

我在这个论坛上找到了一些非常接近的东西,一个名叫“Elektro Hacker”的人回答说,但他的回答是整体CPU使用率,而不仅仅是特定进程的使用情况 . 这是他建议的批处理文件:

@Echo OFF

SET    "SERVICE=Themes"
SET /A "MAXUSAGE=95"
SET /A "INTERVAL=5"

:LOOP 
For /F %%P in ('wmic cpu get loadpercentage ^| FINDSTR "[0-9]"') do (
    IF %%P GTR %MAXUSAGE% (
        Echo [%TIME:~0,8%] CPU Usage: %%P%% Reached the limit: %MAXUSAGE%%%
        Echo Restarting %SERVICE% ...
         SC STOP  "%SERVICE%" 1>NUL
        SC START "%SERVICE%" 1>NUL
        Echo Service restarted.
    ) ELSE (
         Echo [%TIME:~0,8%] CPU Usage: %%P%%
    )
)
Ping -n %INTERVAL% Localhost >NUL
GOTO :LOOP

他还说:“为了更加精确,您可能希望使用以下方法检查与服务关联的可执行文件的当前CPU百分比:

wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessor
Time

这是我无法通过的部分,我不断收到错误,每当我尝试通过稍微改变它来修复它时,我会得到不同的错误!

任何人都可以稍微改变这个代码,让它得到说“MyProcess”的CPU流程和服务名称是不同的,我不确定这是否有所作为,但认为值得一提 .

我的编码知识充其量是最小的,所以非常感谢你给我的任何帮助或建议,这让我疯狂!

非常感谢!

3 回答

  • 0

    Powesshell可以做得更好

    get-process wmiprvse | select processname,cpu,id | ? {$_.cpu -gt 90 -and $_.id} | foreach { restart-service winmgmt }
    
  • 0

    删除空格:

    wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime
    

    你也可以这样做:

    wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime | find "myprocess"
    
  • 1

    您需要使用 ^ 从Name,PercentProcessorTime转义逗号 . 它应该看起来像:

    For /F %%P in ('wmic path Win32_PerfFormattedData_PerfProc_Process get Name^,PercentProcessorTime ^| FINDSTR "[0-9]"') do (
    

    但这在语法方面是正确的 - findstr将匹配“ ProcessName %Load ", whereas the script wants to match only " %Load ” .
    不幸的是,我不熟悉Windows批处理脚本,我也不是那么想,所以我不得不使用名为GAWK(gnu awk)的第三方软件才能输出“ %Load ”部分 .

    这是我使用的脚本:
    NB1:SERVICE = ProcessName - 没有.exe!
    NB2:我正在附加.exe:"%SERVICE%" .exe
    NB3:我正在使用taskkill而不是sc stop / start

    @Echo OFF
    
    SET    "SERVICE=ProcessName"
    SET /A "MAXUSAGE=95"
    SET /A "INTERVAL=10"
    
    :LOOP 
    For /F %%P in ('wmic path Win32_PerfFormattedData_PerfProc_Process get Name^,PercentProcessorTime ^| find "%SERVICE%" ^| "C:\Program Files\GnuWin32\bin\awk.exe" "{print $2}"') do (
        IF %%P GTR %MAXUSAGE% (
            Echo [%TIME:~0,8%] CPU Usage: %%P%% Reached the limit: %MAXUSAGE%%%
            Echo Restarting %SERVICE% ...
             taskkill /f /im "%SERVICE%".exe 1>NUL
            Echo Service restarted.
        ) ELSE (
             Echo [%TIME:~0,8%] CPU Usage: %%P%%
        )
    )
    Ping -n %INTERVAL% Localhost >NUL
    GOTO :LOOP
    

相关问题