AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Feststellen (vllt. anhand CPU-Auslastung) ob Prozess auf einem anderen Rechner hängt

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

Ein Thema von Jumpy · begonnen am 29. Apr 2014 · letzter Beitrag vom 29. Apr 2014
Antwort Antwort
Seite 1 von 2  1 2   
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

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

  Alt 29. Apr 2014, 15:21
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 29. Apr 2014, 15:46
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Apr 2014 um 15:50 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#3

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

  Alt 29. Apr 2014, 16:00
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?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 29. Apr 2014, 16:26
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#5

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

  Alt 29. Apr 2014, 16:41
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 29. Apr 2014, 16:47
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union (29. Apr 2014 um 17:00 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

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

  Alt 29. Apr 2014, 19:06
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

Geändert von hathor (30. Apr 2014 um 08:27 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

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

  Alt 29. Apr 2014, 20:04
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 29. Apr 2014, 20:56
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

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

  Alt 29. Apr 2014, 21:03
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 Uhr.
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