PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : nicht reagierende Prozesse per Script abschießen?


PatkIllA
2006-04-20, 08:30:50
Ich würde gerne per Script alle nicht reagieren Prozesse abschießen.
Anscheinend kann XP das sogar von Haus aus mit dem Befehl "taskkill", aber ich kriege es nicht hin, dass es auch das macht was ich möchte

taskkill /f /fi "status eq not responding"
sollte meiner Ansicht nach das gewünschte tun, aber er sagt nur, dass keine Tasks den Kritierien entsprechen.

Alternativen sind natürlich auch willkommen.

Sephiroth
2006-04-20, 17:28:53
Existieren überhaupt solche Tasks, die im Taskmanager auch als Status "keine Rückmeldung" haben?

Thanatos
2006-04-20, 18:00:42
Existieren überhaupt solche Tasks, die im Taskmanager auch als Status "keine Rückmeldung" haben?

Sicher, die Tasks wo nicht mehr reagieren bekommen unter Status ein "Keine Rückmeldug".

PatkIllA
2006-04-20, 18:06:48
im Taskmanager schon.
Mit Taskkill verwandt ist ja anscheinend auch Tasklist und das zeigt mir mit der Status Filterung aber auch alle Prozesse als Running an. Das verwirrt mich schon.

jorge42
2006-04-20, 19:23:39
bei mir funktioniert der filter "STATUS eq running" gar nicht. mit tasklist /v werden alle Stati auch als "Wird ausgeführt" angezeigt. Verwendet man aber diesen Text aber als Filterstring wird der Suchfilter nicht erkannt.

Kann es sein, dass es ein Bug ist? Ein übersetzungsfehler? D.h. der Status wird mit "Wird ausgeführt" angezeigt, aber der Suchfilter kann nur "Running". Das gleiche würde dann natürlich mit "not responding" passieren.

Juerg
2006-04-20, 21:41:48
Also tasklist resp. taskkill verwenden meines Erachtens WMI. Nach Durchsicht der Dokumentation schauts aus dass die Eigenschaften .ExecutablePath bzw. .Status nicht implementiert wurden.


This property is not implemented and does
not get populated for any instance of this class.
This property is always NULL.


Also tut der Taskmanager eine andere Methode verwenden z.B. PSAPI.DLL EnumProcesses(), CreateToolhelp32Snapshot(), Process32First(), and Process32Next() etc...

Das Script zeigt dass die Eigenschaften nur leere stubs sind

'********************************************************************
'* File: processes.vbs
'* Purpose: display service information on a computer using WMI
'* Requires: WMI to be installed on server specified
'* Revisions: Initial development - 01/08/01, tonymu
'* Disclaimer: This code is to be used for sample purposes only
'* Microsoft does not guarantee its functionality
'********************************************************************
'Known Issues:
' The following error will be returned if WMI is not installed
' <path-to>\services.vbs(23, 1)
' Microsoft VBScript runtime error: ActiveX component
' can't create object: 'GetObject'

Dim oArgs, strServerName, oProcessSet, oWshNetwork

Set oArgs = WScript.Arguments
If oArgs.Count > 0 Then
strServerName = trim(oArgs(0))
Else
strServerName = "LocalHost"
End If
Set oProcessSet = _
GetObject("winmgmts:{impersonationLevel=impersonate}!//" & _
strServerName & "/root/cimv2").InstancesOf("Win32_Process")

If strServerName = "LocalHost" Then
Set oWshNetwork = WScript.CreateObject("WScript.Network")
WScript.Echo "Process Information retrieved from " & oWshNetwork.ComputerName
Set oWshNetwork = Nothing
Else
WScript.Echo "Process Information retrieved from " & strServerName
End If
WScript.Echo String(75, "_")
For each Process in oProcessSet
WScript.Echo Process.ProcessId & _
Chr(9) & Process.Name & " " & _
Process.Status & ", " & _
Process.ExecutionState & ","
Next
WScript.Echo String(75, "_")
Set oProcessSet = Nothing

jorge42
2006-04-21, 13:05:13
das wär ja mal ein knaller, eine nicht implementierte Funktion als vorhanden zu dokumentieren. leider unterstützen PSList und PSKill aus den PSTools von Sysinternals leider auch keine filterfunktionen.

Sephiroth
2006-04-21, 15:50:33
Ich hab mich mit der Geschichte nochmal etwas genauer befasst ... das mit dem Status klappt nur für Dienste. Warum?

Zunächst ist es so, daß ein Prozeß (damit mein ich keine Dienste, obwohl das ja auch Prozesse sind) nicht unbedingt einen Status haben muß aber haben kann, wenn es der Entwickler will. Diesen könnte man dann mit einer angepaßten Klasse abfragen. Zum anderen heißt "keine Rückmeldung" (not responding) ja auch nur das der Prozeß zu beschäftigt ist, um auf die Anfragen in seiner message qeue zu reagieren - er muß sich also nicht zwangsläufig aufgehängt haben.
Die Win32_Process Klasse ist abgeleitet von der CIM_Process Klasse, die hat die Status property, welche von der Oberklasse CIM_ManagedSystemElement geerbt wurde, zu der wiederum alle Arten von Prozessen gehören. Werte für Status: OK, Error, Degraded, Unknown, Pred Fail, Starting, Stopping, Service, Stressed, NonRecover, No Contact, Lost Comm

Wir sehen schon da gibt es nix wie not responding. (wobei man stressed nehmen könnte ;D)

Bei einem Dienst spielt der Status ja ein wichtige Rolle. Dienste werden beim Starten von Windows erstellt und ggf. gestartet, es ist wichtig zu wissen in welcher Phase er sich befindet und sie sind im Speicher, selbst wenn sie nicht gestartet sind - daher klappt das mit dem Status auslesen. Bei einem normalen Prozeß spielt das aber offenbar keine Rolle - entweder ist er gestartet und befindet sich im Speicher oder nicht.
So oder so ähnlich haben sich das die WMI-Leute wohl gedacht, wenn sie meinen nicht mal die beiden popligen Werte, wie sie es der Taskmanager zeigt, implementieren zu müssen. Folglich ist die status property immer NULL bei einem Win32_Process Objekt.

Bleibt also noch die spannende Frage wieso tasklist und taskkill dann überhaupt diese Filter-Funktion haben, wenn sich nicht genutzt werden kann?

p.s.
Um es nochmal zu klar zu stellen: normale Prozesse (keine Dienste) haben keinen Status (normalweise) unter Windows aber Threads durchaus (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemthreadingthreadstateclasstopic.asp).

p.p.s
Jürg, der Taskmanager verwendet dazu SendMessageTimeout, weil es etwas anderes imho nicht gibt. Und das klappt ja auch nur bei GUI Anwendungen.

Juerg
2006-04-21, 20:54:29
Ich habe mal die andere Möglichkeit versucht...

taskkill /f /fi "status eq running"
Dieser Code funktioniert tadellos. :eek: :mad: :frown: :| Es zieht einem einfach die Maschine unter den Füssen weg. grmmmbl :biggrin: