Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hängt (https://www.delphipraxis.net/180189-feststellen-vllt-anhand-cpu-auslastung-ob-prozess-auf-einem-anderen-rechner-haengt.html)

Jumpy 29. Apr 2014 14:21

Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hängt
 
Hallo,

ich habe einen Dienst geschrieben, der mit einem anderen (fremden und alten) Dienst auf einem anderen Rechenr per Telnet kommuniziert. Gelegentlich klappt die Verbindung nicht, dann warte mein Dienst eine zeitlang und versucht es dann erneut. Das geht oft gut.

Manchmal ist es aber so, dass der andere Dienst sich aufgehängt hat. Ich würde nun gerne von meinem Dienst auf Rechner A feststellen, ob sich der andere Dienst auf Rechner B wirklich aufgehöngt hat. Im Tastmanager des anderen Rechners kann ich das z.B. an der CPU-Auslastung erkennen, die immer so bei 50% für den Prozess des anderen Dienstes steht, wenn der sich aufgehängt hat (sonst viel weniger).

Frage 1: Wie könnte ich sowas aber (ohne manuell den Taskmanager zu nutzen) innerhalb eines Programmes feststellen.

Frage 2: Wie kann ich den anderen Prozess (auf B) dann von Rechner A aus abschießen (dazu hab ich auch schon gegoogelt, z.B. pskill.exe von Sysinternals wurde da gennannt aber vllt. auch andere Ideen). Ich kann auf jeden Fall den anderen Dienst nicht stoppen, da der nicht mehr reagiert.

Ich weiß, wie ich den Dienst nach einer Wartezeit wieder starten könnte, das würde ich immerhin hinkriegen. Aber hauptsächlich bei Frage 1 bräuchte ich mal Hilfe oder Anregungen.

Ach ja: Die betroffenen Rechner sind noch Windows Server 2003.

himitsu 29. Apr 2014 14:46

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Nja, du könntest einfach pskill aufrufen? (oder mal debuggen, welche Funktionen es verwendet)

Du kannst aber auch auf dem selben Rechner einen weiteren Service starten, welcher die Überwachung übernimmt.
Delphi-Referenz durchsuchenTerminateProcess (OpenProcess geht aber scheinbar nur auf den selben PC)



Bezüglich der "CPU-Auslastung" ... da such dir einfach eines der vielen Beispiele. Die APIs lassen sich nicht nur auf den eigenen Prozess anwenden (siehe Taskmanager).

Aber das bringt nicht unbedingt was.
Hat dein Prozess denn immer eine hohe Auslastung, wemm er hängt?
Und andersrum gefragt: Hängt er denn immer, wenn die Auslastung hoch ist?

PS: Hier ist das Delphi heute mal nett hängen geblieben, mitten beim Codeschreiben und das mit 0% CPU-Auslastung.

Besser wäre es wohl, wenn du die Funktion(en) des Prozesses prüfst, ob sie funktionieren.

Jumpy 29. Apr 2014 15:00

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Die einzige Funktion mit der ich den Prozess/Dienst auf Rechner B prüfen kann, ist afaik die Telnetverbindung. Die kann auch schonmal nicht zustande kommen, wenn der Prozess B gerade mit irgendwas beschäftigt ist, oder...
Für den Fall versuche ich es ja auch immer mehrfach (mit zeitl. Abstand) noch einmal.

Spätestens beim 4-5 mal würde ich dann aber doch gerne wissen wollen, ob B wirklich noch arbeitet. Und ja, er hängt immer wenn die Auslastung hoch ist (50%). Soweit ich sonst gesehen habe geht der mal bis 20-30% wenn er gerade was macht (Systeme scannen, z.B.) aber die meiste Zeit dümpelt er bei <1% rum. Wenn ich denn dann wüßte wie würde ich die Prüfung auf 50% natürlich auch erst 2-3 mal machen, bevor ich definitiv davon ausgehe, das es hängt und Maßnahmen ergeife.

Aber dein Vorschlag klingt jetzt irgendwie nach einem weitern Programm oder Prozess oder Dienst, der auch auf Rechner B läuft und der daher die CPU-Auslastung mit einem der vielen Beispiele (wie du es genannt hast) prüfen kann. Sprich das von Rechner A aus direkt zu machen siehst du auch keine Möglichkeit?

Union 29. Apr 2014 15:26

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Das ist zwar keine Lösung für Dein eigentliches Problem, aber ich sende in solchen Fällen aus dem "Watchdog" heraus eine EMail. In diesen Fällen wird dann weltweit schon irgend jemand reagieren. Fehlalarme gab es bei mir noch nicht. Meine eigenen Dienset schreiben regelmäßíg ein Logfile mit Timestamp, auch wenn sie nichts tun. So läßt sich sehr einfach feststellen ob die sich selber aufhängen.

Jumpy 29. Apr 2014 15:41

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Das hab ich jetzt auf die schnelle auch so umgesetzt, dass dann eine Email an die Admins geht. Ist in der Regel dann auch OK und wenn das Nachts passiert weiß der erste Admin der zur Arbeit kommt direkt Bescheid.
Trotzdem wär es natürlich cool, wenn mein Dienst den fehlerhaften fremden Diesnt selber killen und neustarten könnte.

Ich habe mich durch ein paar MSDN-Einträge und Artikel von Mark Russinovich bzgl. pskill gearbeitet und bin dabei auf dessen Bruder psList gestossen, der vllt. das kann was ich suche. Werde das mal probieren.

Union 29. Apr 2014 15:47

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Falls Du weitreichende Rechte auf dem Zielrechner hast und etwas Zeit zur Analyse, könntest Du evtl Speicherbereiche des fremden Dienstes auf Unterschiede in Intervallen prüfen, in sich denen bei normalem Ablauf etwas ändert. Oder Du erstellst einen Task, der den Dienst "vorsorglich" regelmäßig über sc.exe neu startet.

EDIT: Diese Unit habe ich mal selber eingesetzt, um ggf. einen Thread auszubremsen. Um den Prozentsatz der Auslastung festzustellen, muss das result von wsGetCpuUsage noch durch die Anzahl der Prozessoren geteilt werden.

hathor 29. Apr 2014 18:06

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Zitat:
In Microsoft Windows XP SP1 and later operating systems, GDI uses a watchdog timer to monitor the time that threads spend executing in the display driver. The watchdog defines a time threshold. If a thread spends more time in a display driver than the threshold specifies, the watchdog tries to recover by switching to VGA graphics mode.
If the attempt fails, the watchdog generates bug check 0xEA, THREAD_STUCK_IN_DEVICE_DRIVER.

Vielleicht lässt sich so etwas Ähnliches auch auf dem Zielrechner einrichten.

Stichwort: IsProcessRunning
http://www.delphipraxis.net/168662-b...tet-wurde.html
#6

http://www.delphipraxis.net/177915-p...uerzt-ist.html
http://www.delphipraxis.net/174350-w...angen-hat.html
http://www.delphipraxis.net/122731-w...mm-haengt.html
http://www.delphipraxis.net/66018-fe...ohren-ist.html

Dejan Vu 29. Apr 2014 19:04

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Vielleicht hilft das hier:
Delphi-Quellcode:
function IsAppRespondigNT(wnd: HWND): Boolean;
type
  TIsHungAppWindow = function(wnd:hWnd): BOOL; stdcall;
var
  hKernel: THandle;
  IsHungAppWindow: TIsHungAppWindow;
begin
  Result := True;
  hKernel := GetModuleHandle('user32.dll');
  if (hKernel > 0) then
  begin
    @IsHungAppWindow := GetProcAddress(hKernel, 'IsHungAppWindow');
    if Assigned(IsHungAppWindow) then
    begin
      Result := not IsHungAppWindow(wnd);
    end;
  end;
end;

himitsu 29. Apr 2014 19:56

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Nur über Telnet wirst du wohl Probleme haben.
Da bleibt dann nur noch ein lokaler Überwachungsdienst.

Unsere ServerApp blieb auch manchmal hängen.
Da hatte ich dann erstmal einen Logging-Thread in der Anwendung erstellt, der Loggt regelmäßig einige Dinge.
- die CPU-Auslastung des eigenen Prozesses
- der eigene Arbeitsspeicher
- - Belegung, Ungenutzt (Defragmentierung) ... aber das das geht im FastMM einfacher auszulesen
- Belegung / Frei des eigenen virtuellen Speichers
- Belegung / Frei realen RAM
- Belegung / Frei / Auslagerungsdatei des eigenen globalen Arbeitsspeichers
- nja, und dann halt noch so paar Dinge, wie Anzahl der DataSnap-Verbindungen, und die Aufruf-Anzahl verschiedener AppsFunktionen

Wird aktuell alle 10 Sekunden gemessen, und dann alle 5 oder 15 Minuten in eine Logdatei gespeichert, mit Min, Max und Durchschnitt (innerhalb des Logintervals)

So hat man zumindestens erstmal einen kleinen Überblick, was eigentlich läuft.

(Der halbwegs kleine Code läuft so aber erst ab D2009, bzw. D2006, mit kleinen Änderungen)

Dejan Vu 29. Apr 2014 20:03

AW: Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hä
 
Zitat:

Zitat von himitsu (Beitrag 1257436)
Nur über Telnet wirst du wohl Probleme haben.

Es ist mir auch neu, das man per TelNet Prozesse abschießen kann, außer, man hat einen Exploit. Natürlich benötigt man einen entsprechenden Zugriff auf dem Zielrechner.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz