Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

XP: Wie Programm mit hoher CPU-Last killen und neu starten

habreli / 9 Antworten / Baumansicht Nickles

Ich habe das Problem, dass sich eine Visualisierungssoftware zeitweise aufhängt - sprich sie produziert 100% Last auf dem Rechner und bewegt sich nicht mehr. Ein Killen und Neustarten der Software "löst" das Problem.

Nun suche ich ein scriptfähiges Tool, mit welchem ich die CPU-Last eines Prozesses/Programmes abfragen kann.
Wenn also die CPU-Last bei diesem Programm auf über 80% steigt, möchte ich das einfach mittels Script killen und neu starten.

Bitte keine Diskussionen, weshalb das Programm hängt - der Hersteller arbeitet daran - nur so lange will ich nicht warten.

Vorstellen könnte ich mir auch ein Watchdog - Programm bzw. auch eine Realisierung mittels Powershell wäre möglich - nur hier fehlt mir die Idee, wie das gehen könnte.

bei Antwort benachrichtigen
Data Junkey habreli „XP: Wie Programm mit hoher CPU-Last killen und neu starten“
Optionen

Hi habreli,

gehe mal auf die Konsole und gib taskkill /? ein

Wenn du taskkill /? >>mein.txt eingibst, kannst du dir den Syntax in der Textdatei ansehen, und ein entsprechendes Script basteln.

Ich würde das Script mit .cmd enden lassen, ist besser als .bat

Greez, Thomas

bei Antwort benachrichtigen
habreli Data Junkey „Hi habreli, gehe mal auf die Konsole und gib taskkill /? ein Wenn du taskkill /?...“
Optionen

Hmm...
...mit Taskkill kann ich nicht wirklich die CPU-Last eines Programms checken. Oder hab ich da was übersehen?
Und auf Taskkill /im StehendesProgramm.exe /fi "status eq not responding" bekomme ich:
Es werden keine Tasks mit den angegebenen Kriterien ausgeführt.
Sprich - Taskkill erkennt nicht, dass das Programm hängt.

bei Antwort benachrichtigen
Data Junkey habreli „Hmm... ...mit Taskkill kann ich nicht wirklich die CPU-Last eines Programms...“
Optionen

Klar, du musst natürlich schon den Namen oder die Prozess-Kennung beim Taskkill mit angeben, sonst geht da nix.

Da musst du schon ein bisschen "nachforschen" wie das bei dir geht.

Mit Taskkill /? bekommst du die Hilfe

Mit start kannst du ein Programm starten.
Mit start /? bekommst du Hilfe.

Taskkill überwacht nicht deine Prozesse. und Run auch nicht. Du musst dieses Script schon "von Hand" ausführen. Aber das ist mit einem Klick erledigt, und bequemer als ewig mit der Maus rumzuklicken. ..

So, gut dass ich nachgesehen habe. ..

Ich habe nämlich gerade gesehen, dass es zum Taskkill noch eine Alternative gibt: Und zwar tskill.

Ich habe mit zum Starten und Beenden meiner VmWare-Workstation 2-Scripte geschrieben, weil die VmWare eine Menge Ressourcen frisst. Dazu habe ich 2 verschiedene Ansätze erstellt, welche beide Funktionieren.

Du musst dich natürlich schon selber etwas mit diesen Konsolen-Befehlen auseinandersetzen, damit was für dich brauchbares herauskommt.

Ich klebe dir jetzt einfach mal meine Scripte hier rein. Die kannst du natürlich nicht so verwenden, aber sie können dir evtl. dabei helfen, einen Ansatz für dein Skript zu finden.

Anmerkung:
Wenn du in einem Script einen Prozess (oder Programm) beenden und neu starten willst, solltest du mit "start" und der Option "wait" arbeiten. Damit wird verhindert, dass die Anwendung einen Start-Befehl bekommt, ohne vorher richtig beendet worden zu sein.
Mit "start" kannst du auch die Priorität festlegen. ...Das ist es doch, was du u.a. wolltest. .. :-)
-----------------------------------------
Variante 1
-----------------------------------------
@Echo off
cls
cd \
c:
cd \
cd WINDOWS\SYSTEM32
sc stop "VMware NAT Service"
sc stop VMnetDHCP
sc stop vmount2
sc stop VMAuthdService
sc stop MSDTC
tskill vmware-tray /A
------------------------------------------
Variante 2 (etwas ausgereifter)
------------------------------------------
@Echo off
cls
cd \
c:
cd \
cd WINDOWS\SYSTEM32

FOR %%I IN ("VMware NAT Service" VMnetDHCP vmount2 VMAuthdService) DO SC STOP %%I /WAIT
FOR %%K IN (vmware-tray) DO TSKILL %%K /A

cd %TEMP%
IF EXIST %TEMP%\vmware-Admin3400\NUL DEL %TEMP%\vmware-Admin3400\*.*
IF EXIST %TEMP%\vmware-Admin3400\NUL RD %TEMP%\vmware-Admin3400
DEL *.log /F /Q /A
CD %windir%\Temp
CD
dir

DEL *.log /F /Q /A
------------------------------------
Das Starten sieht so aus:
------------------------------------
@Echo off
cls
cd \
c:
cd \
cd WINDOWS\SYSTEM32

start C:\Programme\VMware\Workstation\vmware-tray.exe /WAIT
REM sc start MSDTC
REM sc start VMAuthdService
REM sc start vmount2
REM sc start VMnetDHCP
REM sc start "VMware NAT Service"

for %%I IN (VMAuthdService vmount2 VMnetDHCP "VMware NAT Service") do sc start %%I /WAIT
----------------------------------------

Die Dateiendung sollte .cmd sein.

Viel Erfolg, Thomas :-)

bei Antwort benachrichtigen
habreli Data Junkey „Klar, du musst natürlich schon den Namen oder die Prozess-Kennung beim Taskkill...“
Optionen

Vielen Dank für Deine ausführliche Info.
Und... ich habe VOR dem Schreiben nachgeforscht....darum die Frage, ob ich evtl. was übersehen habe...

Meiner Meinung nach geht TASKKILL an der Anforderung vorbei. Dass ich damit ein beliebiges Programm abbrechen kann ist mir schon klar.
Nur: Da muss ich vor dem Rechner stehen und sehen, dass das Programm hängt - dann kann ich das Script starten - klar.

Die Frage bzw. Anforderung war jedoch - Zitat:
Nun suche ich ein scriptfähiges Tool, mit welchem ich die CPU-Last eines Prozesses/Programmes abfragen kann.

So könnte ich z.b. per Scheduler alle paar Minuten checken ob das Programm normal läuft (1-2% CPU Last) oder "hängt" (98-100% CPU Last). Und falls dies der Fall ist, könnte man mit Taskkill abschießen und neu starten.
Aber ich kann derzeit nicht checken, ob das Programm CPU-Last produziert oder nicht.

bei Antwort benachrichtigen
Data Junkey habreli „Vielen Dank für Deine ausführliche Info. Und... ich habe VOR dem Schreiben...“
Optionen

Achso Habreli, du willst das automatisieren.

Tja, ich habe lange Gegoogelt, aber leider nix gefunden.
http://www.pqtuning.de/server2003/konsole/konsole.htm
http://www.winhelpline.info/daten/dos/

dürfte wohl so ziemlich alles sein, was mit der Konsole zu machen ist.

Fällt mir im Moment leider nix ein dazu. :(

Sorry, Thomas

bei Antwort benachrichtigen
Synthetic_codes Data Junkey „Achso Habreli, du willst das automatisieren. Tja, ich habe lange Gegoogelt, aber...“
Optionen

mit einer programmiersprache wie C könntest du per winapi die prozesse inklusive ihrer eigenschaften -> dazu gehört bei windows auch die verursachte auslastung
abfragen. und die WinAPI stellt praktischerweise auch funktionen bereit um tasks sterben zu lassen.

'); DROP TABLE users;--
bei Antwort benachrichtigen
Data Junkey Synthetic_codes „mit einer programmiersprache wie C könntest du per winapi die prozesse...“
Optionen

Also von C habe ich null Ahnung, wie das beim Habreli ist weiß ich natürlich nicht. ..

Ich habe bestimmt einen Ganzen Tag lang mit "Systemprotokolle und Warnungen" ein Ereignis auszulösen; --->keine Chance. :(

Es ist mit zwar gelungen, mit Hilfe der Systemwarnung eine Meldung in die Systemereignisse zu schreiben, sobald der Prozi. über 20% Auslastung geht, aber diese Warnung weigert sich ein Programm oder eine .cmd auszuführen, obwohl die Einstellung von Warnungen dies ermöglicht. Das Prog wird einfach nicht gestartet.

Ich habe es nach einem sehr langen Tag und 100erte Versuche frustriert aufgegeben. :((

Es besteht aber durchaus die Möglichkeit, dass diese Methode auf einem anderen System funktioniert. ..

Mein MCE2002 ist der letzte Schrott. Jedes XP-Prof ist um Lichtjahre besser.

Gruß, Thomas

bei Antwort benachrichtigen
Synthetic_codes Data Junkey „Also von C habe ich null Ahnung, wie das beim Habreli ist weiß ich natürlich...“
Optionen

wenn ich zeit zwischen der arbeit habe setz ich mich heut abend mal dran

'); DROP TABLE users;--
bei Antwort benachrichtigen
Data Junkey Synthetic_codes „wenn ich zeit zwischen der arbeit habe setz ich mich heut abend mal dran“
Optionen
wenn ich zeit zwischen der arbeit habe setz ich mich heut abend mal dran

Whow, das ist aber lieb von dir. Da werden sich bestimmt mindestens zwei freuen. .. ;)

Ich kämpfe gerade mit dem Thunderbird. .. :(
bei Antwort benachrichtigen