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 进程和服务名称不同,我不确定这是否会有所不同,但认为值得一提。

我的编码知识充其量是最少的,因此非常感谢您能给我的任何帮助或建议,这让我发疯了!

非常感谢!

4

3 回答 3

1

Powesshell 可以做得更好

get-process wmiprvse | select processname,cpu,id | ? {$_.cpu -gt 90 -and $_.id} | foreach { restart-service winmgmt }
于 2016-06-13T15:41:15.130 回答
0

删除空格:

wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime

你也可以这样做:

wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime | find "myprocess"
于 2013-06-18T09:02:35.117 回答
0

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

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

但这在语法方面是正确的 - findstr 将匹配“ ProcessName %Load ”,而脚本只想匹配“ %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
于 2015-03-03T13:28:13.630 回答