Frage

Kennt jemand eine Möglichkeit zu erkennen, ob ein Remote-App ist fehlgeschlagen / abgestürzt? Ich bin das heißt, wenn es nicht mehr verwendet werden - Sie würden in der Regel sehen in der Titelleiste, in diesem Fall „Reagiert nicht“ - aber der Schlüssel ist, dass die App noch läuft; deshalb nur den Prozess nicht mehr zu finden, läuft nicht genug ist.

WMI nicht unterstützt die Verwendung von System.Diagnostics.Process.Responding auf einem entfernten Rechner .. und ihre scheint keine andere WMI-Eigenschaften zu sein, die ich in Win32_Process für diese Art von Informationen abfragen kann.

War es hilfreich?

Lösung

Bei der Bestimmung ‚Vitalitäts‘ eines Programms ist es wichtig, diesen Aspekt zu messen die definiert sie in sinnvoller Weise am Leben zu sein.

Mehrere einfachen ‚Proxy‘ Ansätze sind ansprechend oberflächlich aufgrund ihrer Einfachheit, aber im Grunde nicht messen den wichtigen Aspekt.

Vielleicht ist die am häufigsten sind die „Ist der Prozess am Leben“ und „getrennte Herzschlag Broadcast thread“ wahrscheinlich, weil es so einfach ist zu tun:

bool keepSending = true; // set this to false to shut down the thread
var hb = new Thread(() => 
    {
         while (true)
             SendHeartbeatMessage();   
    }).Start();

Beide haben jedoch einen schweren Fehler, wenn der reale Arbeitsfaden (s) in der App einsperren (sagen in eine Endlosschleife oder eine Sackgasse gehen), dann werden Sie auch weiterhin fröhlich OK-Meldungen auszusenden. Für den Prozess basierten Überwachung werden Sie auch weiterhin den Prozess ‚lebendig‘ obwohl es nicht mehr sehen, Durchführung, es ist real Aufgabe.
Sie können den Faden eine in vielerlei Hinsicht verbessern (erheblich die Komplexität und die Chance Threadingprobleme erhöht wird), indem Sie auf dem Hauptthread auf Tests für den Fortschritt Schichtung aber das braucht die falsche Lösung und versucht, es nach rechts ein drücken.

Was ist das Beste ist, um die Aufgabe zu machen (s) durch den Programmteil der Vitalitätsprüfung durchgeführt. Vielleicht zu Herzschlag direkt aus dem Haupt-Thread nach jeder Teilaufgabe erledigt (mit einem Schwellenwert, um sicherzustellen, dass es nicht zu oft passiert) oder einfach den Ausgang zu sehen (falls vorhanden) und stellen Sie sicher, dass die Eingänge in Ausgängen zur Folge hat.

Es ist besser, noch diese intern sowohl zur Validierung (im Rahmen des Programms) und extern (vor allem, wenn es externe Verbraucher / Nutzer des Programms). Versuch, es zu benutzen, wenn Ihre Anwendung einige Ereignisschleife basiertes System ist: Wenn Sie einen Web-Server haben Triggerereignisse, auf die muss sie reagieren (und überprüfen Sie die Ausgabe korrekt ist). Was auch immer geschieht, immer bedenken, dass Sie das überprüfen möchten nützlich und das richtige Verhalten auftritt und nicht nur eine Tätigkeit überhaupt.

Je mehr Sie überprüfen nicht nur die Existenz des Programms, aber es ist Aktionen desto nützlicher Ihr Scheck wird. Sie werden mehr des Systems überprüfen, je weiter man sich vom internen Zustand versetzt, wenn Sie Ihren Monitor-Prozess auf dem Feld laufen können Sie nur lokale Loopback überprüfen, die Box Ablaufen validiert viel mehr von der Netzwerk-Stack einschließlich oft vergessen Aspekte wie DNS .

Zwangsläufig dies die Prüfung schwerer zu tun macht, weil Sie von Natur aus über eine bestimmte Aufgabe zu denken sind, eher als eine allgemeine Lösung, die Dividenden aus dieser sollten ausreichend Vorteile für diesen Ansatz ergeben ernsthaft in vielen Fällen in Betracht gezogen werden.

Andere Tipps

Es ist schwer zu wissen, ob eine App abgestürzt ist oder tatsächlich tut etwas Nützliches.

Bedenken Sie:

 while(true);

Der Prozessor ist (sehr) beschäftigt. Und es könnte auch reagieren, wenn diese in einem separaten Thread durchgeführt wird. Dies ist jedoch wirklich unerwünschtes Verhalten, da die App nicht mehr funktioniert.

Die beste Weg, dies zu bekämpfen ist in regelmäßigen Abständen (an bestimmten Punkten in der Software) bestimmte Leistungsindikatoren hinzufügen und diese übertragen. Ein Watchdog-App für diese Sendungen hören kann, und wenn sie ankommen oder Sinn nicht mehr machen (Zähler nicht aufaddieren), dann können Sie den Prozess beenden und neu starten.

Rundfunk kann auf mehrere Arten erfolgen. Einfachste ist es, nur die Zähler in eine Datei zu schreiben (stellen Sie sicher, dass die Datei gesperrt ist, wenn Sie in sie schreiben so ein Leseprozess nicht eine halbe verstümmelten Datei nicht erhalten, wenn es sie an der exakt gleichen Zeit liest)

erweiterte Möglichkeiten, um Named Pipes zu verwenden, oder eine Buchse zu verwenden. UDP-Sockets ist zu installieren und zu verwenden in diesem Fall sehr einfach. Sorgen Sie sich nicht um ‚Packetloss‘ da in einem lokalen Netzwerk dies so gut wie nie passiert

Sie können die Polling-Mechanismus verwenden, und in regelmäßigen Abständen den Status der Remote-Anwendung fragen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top