tralveller
Goto Top

Batch: CPU-Auslastung eines Prozesses auslesen und als Variable definieren

Hallo zusammen,

ich bin aktuell daran ein Batch-Skript zu erstellen, worin ich:
- Prozess mit aktueller CPU-Last auslese
- Anhand des Wertes entscheide, ob der Prozess noch arbeitet oder das Tool neu gestartet werden muss

Aktuell nutze ich folgenden Befehl:
wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime | findstr /i /c:vmware-vmx

und erhalte folgende Ausgabe:
"
vmware-vmx 97

"
Die Ausgabe beinhaltet 2 Zeilen und nach "vmware-vmx" und "97" viele Leerzeilen.

Wie bekomme ich es hin, dass der 2. Wert (in dem Fall 97) ohne Leerzeichen genommen wird und als Varaible gesetzt wird, damit ich diesen auswerten und ggfs. die Prüfung wiederhole (möchte es solange der Wert größer 0 ist.
Der Wert kann sowohl 1, 2 oder 3 Stellen beinhalten.


Ich muss gestehen, dass ich da einfach nicht weiterkomme face-plain

Danke an alle und Grüße
Tralveller

Content-ID: 333056

Url: https://administrator.de/contentid/333056

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

rubberman
Lösung rubberman 24.03.2017 aktualisiert um 01:00:35 Uhr
Goto Top
Hallo tralveller

Du kannst 1) gleich im WQL Statement per WHERE filtern und 2) das Ergebnis mit Option /value in ein gefälliges Eigenschaft=Wert Format bringen. In FOR /F Schleifen verarbeitet, kommst du schnell zum Ergebnis in einer Variable.
for /f %%i in (
  'wmic path Win32_PerfFormattedData_PerfProc_Process where "Name='vmware-vmx'" get PercentProcessorTime /value'  
) do for /f "tokens=2 delims==" %%j in ("%%i") do set "percentage=%%j"  
Grüße
rubberman
132692
Lösung 132692 24.03.2017 um 07:06:10 Uhr
Goto Top
Anhand des Wertes entscheide, ob der Prozess noch arbeitet oder das Tool neu gestartet werden muss
Dann doch besser so
Programm reagiert nicht - per Powershell neu starten?

Gruß p.
tralveller
tralveller 27.03.2017 aktualisiert um 04:39:35 Uhr
Goto Top
Hallo zusammen,

@rubberman:
Super, genau das habe ich gesucht face-smile
Das Stück Code klappt super und ich konnte nun soweit mir etwas zurecht bauen face-smile face-smile

@132692:
Danke für die Info. Powershell steht eh für diese Jahr auf der Agenda!
Aber für die Kürze der Zeit kann ich mich aktuell einfach nicht darin einlesen/arbeiten :| face-smile

Ich hab das Skript soweit nun fertig; das enthält noch ein paar andere Eigenschaften z.B. max. "Zeit" bis das Skript abbrechen soll; mehrfach-Prüfung, um sicherzustellen, dass der Prozess über längere Zeit keine Auslastung mehr hat; Vorab-Prüfung, ob der Prozess vorhanden/aktiv ist; Gesamtzeit der Skript-Durchlaufs am Ende anzeigen.

Das ganze lasse ich als Dienst mit "srvany.exe" von MS laufen, damit es unabhängig von einer Benutzeranmeldung läuft.

Mag evtl. für den ein oder anderen etwas umständlich, für andere aber auch evtl. nützlich sein, daher mal der Post vom Code face-wink face-smile

Danke und Grüße
Tralveller

REM Set default value for %COUNTER% to make sure that value is available
SET COUNTER=0
REM
REM Set default value for %SKRIPT_RUNNING_TIME% to make sure that value is available
SET SKRIPT_RUNNING_TIME=0
REM
REM Set default value for %SCRIPT_DONE% to make sure that value is available
SET SCRIPT_DONE=0
REM
REM Set wait time between reanalyse
SET SECONDS_WAIT=3

REM Defined value of process
ECHO Defined value of process
SET SERVICE_PROCESS=explorer

REM Max. script running time
SET SKRIPT_MAX_TIME=3600


:CHECK-PROCESS-AVAILABILITY
REM count up time
SET /A SKRIPT_RUNNING_TIME=%SKRIPT_RUNNING_TIME%+%SECONDS_WAIT%
ECHO\
REM warten beovr die Analyse der Auslastung wiederholt wird
ECHO Wait %SECONDS_WAIT% seconds
PING 127.0.0.1 -n %SECONDS_PING% >NUL
ECHO\
ECHO\
ECHO Check if Process has been started
TASKLIST |FIND /i "%SERVICE_PROCESS%" >NUL  
IF %ERRORLEVEL%==0 (
	ECHO ^=^> Yes, Process seems to be started
	ECHO\
	ECHO\
	GOTO START
	) ELSE (
	ECHO ^=^> No, Process not started
	GOTO CHECK-PROCESS-AVAILABILITY
	)
:START
REM count up time
SET /A SKRIPT_RUNNING_TIME=%SKRIPT_RUNNING_TIME%+%SECONDS_WAIT%
REM Check if Skript reached maximum time lime
IF %SKRIPT_MAX_TIME% LSS %SKRIPT_RUNNING_TIME% (
	ECHO Maximum time of %SKRIPT_MAX_TIME% seconds reached, performing reboot
	GOTO EXIT
	)
ECHO\
ECHO Count is %COUNTER%
IF %COUNTER% GTR %REPEAT_TRY% (
	GOTO CPU-USAGE-NULL
	) ELSE (
	ECHO\
	)
ECHO Wait %SECONDS_WAIT% seconds
PING 127.0.0.1 -n %SECONDS_PING% >NUL
ECHO\
ECHO\
:CPU-USAGE
REM !!!! Attention !!!!
REM If requrested Process will crashed during script:
REM The script will run in endless loop until now
REM !!!! Attention !!!!
ECHO Check if CPU usage is null percentage
for /f %%i in (
	'wmic path Win32_PerfFormattedData_PerfProc_Process where "Name='%SERVICE_PROCESS%'" get PercentProcessorTime /value'   
	) do for /f "tokens=2 delims==" %%j in ("%%i") do set /a "percentage=%%j/%NUMBER_CORES%"  
IF  %percentage% LEQ %CPU_USAGE_LOW% (
	ECHO ^=^> Yes, CPU Usage is %percentage%^%%, repeating for safety...
	SET /A COUNTER=%COUNTER%+1
	GOTO START
	) ELSE (
	ECHO ^=^> No, CPU Usage is %percentage%^%%, repeating...
	SET COUNTER=0
	GOTO START
	)
:CPU-USAGE-NULL
ECHO\
SET /A IDLETIME=%SECONDS_WAIT%*%REPEAT_TRY%
ECHO CPU Usage was %IDLETIME% seconds at %percentage%^%%
ECHO After %SKRIPT_RUNNING_TIME% seconds srcipt has been started a reboot is required
ECHO\
ECHO\
GOTO EXIT
:EXIT