2013-06-18 1 views
0

J'espère que vous pouvez m'aider avec ceci, j'ai essayé de chercher pendant des heures mais ne peux pas sembler obtenir n'importe où avec lui. J'ai un processus qui commence à consommer de manière aléatoire 50+ CPU plusieurs fois par jour, j'essaye de créer un fichier batch qui fonctionnera en arrière-plan et redémarrera le service si l'utilisation du processeur du processus est supérieure 50 (corrige le problème).Fichier batch pour redémarrer un service spécifique basé sur le processeur d'un processus

J'ai trouvé quelque chose de très proche sur ce forum, un gars nommé "Elektro Hacker" a répondu, mais sa réponse est l'utilisation globale du processeur, pas seulement l'utilisation d'un processus spécifique. Voici le fichier batch il a suggéré:

@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 

Il a également mis: « Pour plus precission vous voulez peut-être vérifier le pourcentage du CPU de l'exécutable associé au service à l'aide:

wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessor 
Time 

C'est la partie que je ne peux pas passer, je continue à obtenir des erreurs, et chaque fois que j'essaie de le réparer en le modifiant légèrement, je reçois des erreurs différentes!

Quelqu'un peut-il changer légèrement ce code, pour obtenir le CPU de dire "MyProcess" Le processus et le service Les noms sont différents, je ne sais pas si cela ferait une différence, mais je pense que cela valait la peine d'être mentionné. Mes connaissances en codage sont minimes au mieux, donc toute aide ou conseil que vous pourriez me donner est grandement apprécié, cela me rend fou!

Merci beaucoup!

Répondre

0

Supprimer l'espace:

wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime 

Vous pouvez également faire:

wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime | find "myprocess" 
+0

Merci pour la réponse, comme je l'ai dit ci-dessus mes connaissances sont minimes, où puis-je mettre ce code?J'ai essayé de remplacer le "wpic cpu get loadpercentage" mais il ne fonctionne pas correctement, il ouvre rapidement le cmd et le ferme, j'ai réussi à prendre une sérigraphie rapide de ce qu'il a dit et il dit "| n'était pas attendu en ce moment ", Aucune suggestion? –

+0

Probablement vous devez écrire^| au lieu de | . Remplacez la ligne wmic + findstr d'origine par la nouvelle wmic + find + findstr – golimar

+0

Donc sur cette ligne j'ai maintenant "For/F %% P in ('wmic chemin Win32_PerfFormattedData_PerfProc_Process get Nom, PercentProcessorTime^| find" monprocessus "^ | FINDSTR" [0-9] "') do (" Maintenant je reçois "Expression GET invalide" que fais-je de mal? –

0

Vous devez utiliser ^ pour échapper à la virgule du Nom, PercentProcessorTime. Il devrait ressembler à:

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

Mais ceci est juste correct en termes de syntaxe - findstr correspondra à « ProcessName% Charge », alors que le script veut correspondre uniquement « % Charge ». Malheureusement, je ne maîtrise pas les scripts de traitement par lots Windows et je ne recherche pas cela. J'ai donc dû utiliser un logiciel tiers appelé GAWK (gnu awk) pour pouvoir sortir uniquement la partie "% Load".

Ceci est le script que j'utilise:
NB1: SERVICE = ProcessName - sans .exe!
NB2: Je suis avec annexant .exe: "% SERVICE%" exe
NB3:. J'utilise taskkill au lieu de 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 
0

Powesshell peut faire mieux

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