Prozesskiller wenn "... Prozess funktioniert nicht mehr" angezeigt wird

  • VB.NET
  • .NET 4.5

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Prozesskiller wenn "... Prozess funktioniert nicht mehr" angezeigt wird

    Sehr geehrte Community,
    ich habe es bisher geschafft mittels Code eine Prozesskontrolle quasi durchzuführen. Wenn Prozess vorhanden dann Panel grün sonst rot.

    Nun der Hintergrund sollte aber wie folgt aussehen:
    Ich habe einen Sender und einen Empfänger gebastelt. Der Empfänger ist unser "Admintool" welches uns mittels Panelfarbe rot oder grün zeigen soll ob der Prozess existiert und oder hängt.
    Wenn der Prozess sagen wir der Prozess "X" nicht mehr funktioniert oder nicht mehr reagiert (lt. Windows: "Prozess X funktioniert nicht mehr und muss beendet werden." soll das bei uns im Admintool sofort als rotes Licht angezeigt werden am Empfänger. Hier soll noch kein Prozess.kill statt finden. Prozess.kill wird von Empfänger am Sender dann quasi gesendet wenn wir das so wollen und entscheiden.

    Gibt es hier Aushilfe für mich? Wie kann ich mittels VB Code hängende Prozesse ermitteln und ABER AUCH ggf. killen/killen lassen?

    Beste Grüße,
    Mikebazz
    @Mikebazz Schau mal hier rein: Prüfen von Prozessen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Schau mal hier rein


    Danke für deine Antwort :) Das sieht ja schon gut aus!

    VB.NET-Quellcode

    1. Sub QuitAllNotRespondingProcesses()
    2. Dim p As Process
    3. Dim processes As Process()
    4. processes = Process.GetProcesses()
    5. For Each p In processes
    6. If Not p.Responding Then
    7. p.Kill()
    8. End If
    9. Next
    10. End Sub


    Und wo kann ich hier in den Code zB definieren das er nur den Prozess "X" oder "Y" checken soll? So wie der Code nun aktuell da steht sieht es so aus als würde er alles checken.

    Grüße,
    Mikebazz

    *Vollzitat entfernt* ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    @Mikebazz Befass Dich mal mit der Process-Klasse:
    docs.microsoft.com/de-de/dotne…ess?view=netframework-4.8
    docs.microsoft.com/de-de/dotne…ame?view=netframework-4.8
    Da sollten Beispiele dabei sein, die Dein Problem lösen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    C#-Quellcode

    1. Sub QuitAllNotRespondingProcesses()
    2. Dim p As Process
    3. Dim processes As Process()
    4. processes = Process.GetProcesses()
    5. For Each p In processes
    6. If Not p.Responding And p.ProcessName = "XYZ" Then
    7. p.Kill()
    8. End If
    9. Next
    10. End Sub


    So um den Dreh. Ist nun aus dem Kopf, hoffentlich ist es richtig. :)
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Sehr geehrte Community,
    mit dem obigen "Code" konnte meine Software das leider nicht erkennen. Im Admintool war noch grünes Licht für quasi den ELSE Bereich also "responding". Das Programm war aber schon lange auf der Standart Microsoft Meldung: "Das Programm XYZ funktioniert nicht mehr und muss beendet werden."

    Ich habe aber auch selbst muss ich gestehen zu diesen Zeitpunkt den Prozess gar nicht erst bei "Details" in den Task-Manager gefunden. Wo der Prozess zu diesem Zeitpunkt war ist ne gute Frage weil offen war es ja eigentlich noch durch die Mic. Meldung. Und gerade das wichtige ist, wenn der Prozess quasi nicht mehr reagiert, wegen der obigen Meldung von Mic. das wir auf unseren FTP in dem Fall, Wert 0 hochgeladen bekommen wobei unsere Adminsoftware Wert 0 als "rot" interpretiert.

    Grüße,
    Mike

    *Vollzitat entfernt da unnötig* ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    @Mikebazz Da wir Dein Problem so nicht nachstellen können, solltest Du parallel zum Task-Manager intensiv mit der Process-Klasse experimentieren, um Deinen Fall zunächst darstellen und dann auch lösen zu können.
    Vielleicht schreibst Du noch, mit welchen Betriebssystemen Du arbeitest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Guten Tag,
    der Administrative Client läuft auf Windows 10 Pro. Der Sender oder in meinen Fall reden wir vom "ServerEye" rennt auf Windows Server 2012 R2 (lizenziert).

    Das Ihr einen besseren Eindruck gewinnen könnt ist hier der aktuelle Code der eingesetzt wird natürlich wurde FTP sowie der eigentliche Prozessname zensiert.
    Der unten stehende Code ist der der am ServerEye oder auch vom "sender" ausgehend.

    VB.NET-Quellcode

    1. Dim p As Process
    2. Dim processes As Process()
    3. processes = Process.GetProcessesByName("XYZ")
    4. For Each p In processes
    5. If Not p.Responding Then
    6. Try
    7. Dim web As New WebClient With {
    8. .Credentials = New NetworkCredential("****", "****")
    9. }
    10. web.UploadString("ftp://****", "0")
    11. Catch ex As Exception
    12. End Try
    13. Else
    14. Try
    15. Dim web As New WebClient With {
    16. .Credentials = New NetworkCredential("****", "****")
    17. }
    18. web.UploadString("ftp://****", "1")
    19. web.UploadString("ftp://****", My.Computer.Clock.LocalTime)
    20. Catch ex As Exception
    21. End Try
    22. End If
    23. Next


    Im Administrativen Client ist der Code recht simpel den brauche ich hier nicht einblenden denke ich.
    Einfach ein web.downloadstring vom FTP. IF 1 oder else mit 0 eben.

    Das Problem ist das ServerEye erkennt scheinbar den Prozess, alles scheint normal. Aber sobald die Microsoft abgestürzt Meldung kommt, sagt er noch immer alles im grünen Bereich. Absoluter non-sense.

    Grüße,
    Mikebazz
    1. Ist die Zielapp eine Konsolenanwendung? Dann kommt immer True zurück. Nur Apps mit GUI können laut Mikrosaft mit False antworten. → welcher Apptyp ist es?
    2. Sobald das "XYZ funktioniert nicht mehr"-Fenster kommt, bekomme ich 2 Antworten! Ein False für die App und ein True für die Meldung, die unter dem gleichen Prozessnamen läuft und somit auch bei GetProcessesByName auftaucht. Vielleicht reicht das als Info, mehr hab ich momentan auch nicht. → Grätscht Dir das vielleicht rein?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    VaporiZed schrieb:

    Vielleicht reicht das als Info, mehr hab ich momentan auch nicht.


    1) Also mein Projekt ist vb und die Applikation um welche es sich handelt ist definitiv keine Konsole.
    2) Die Frage wäre jetzt, wie bekomme ich das ordentlich hin, das mir das quasi angezeigt wird oder ausgewertet wird wenn der Prozess diesen Status eben hat. (XYZ funktioniert nicht mehr"-Fenster) Gibt es hierzu was?

    *Vollzitat korrigiert* ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    €dit:
    Ich habe gerade den Prozess bzw. die Anwendung um was es sich handelt zum abstürzen gebracht. (gewollt)
    Also zur Fehlermeldung: "Der prozess funktioniert nicht mehr".

    Im Taskmanager verwandelt sich beim betreffenden Prozess der "Status" zu "Inaktiv". Kann man mittels VB-Code das hinten bei Details auslesen? Also wenn zB dort inaktiv steht das wir einen restart durchführen?
    (dieses Bild unten ist ein Bild "ergoogelt" - es handelt sich nicht um mein Projekt, es wäre aber auch interessant zb die Abfrage auf die "Status" Tabelle zu beziehen)


    @VaporiZed @Sekki
    Ich weiß nicht, ob UploadString bzw die FTP-Gegenstelle neue Infos an auf dem Server bestehende anhängt oder überschreibt. Mach es mal testweise so (geschrieben aus dem Kopf heraus):

    VB.NET-Quellcode

    1. Dim AllProcessesRespond = Process.GetProcessesByName("XYZ").All(Function(x) x.Responding)
    2. If Not AllProcessesRespond Then
    3. Try
    4. Dim web As New WebClient With {
    5. .Credentials = New NetworkCredential("****", "****")
    6. }
    7. web.UploadString("ftp://****", "0")
    8. Catch ex As Exception
    9. End Try
    10. Else
    11. 'wie bisher


    Wie oft wird dieser Testcode eigentlich durchlaufen? Und: Was wird gemeldet, wenn der Prozess/die App überhaupt nicht läuft.

    Mikebazz schrieb:

    mein Projekt ist vb
    Das ist interessant, aber irrelevant.

    Mikebazz schrieb:

    die Applikation um welche es sich handelt ist definitiv keine Konsole.
    Sondern?

    btw: Bitte Option Strict On, da UploadString mit Strings arbeitet, aber My.Computer.Clock.LocalTime (besser Date.Now mit seinen Funktionen .ToString, .ToShortTimeString, .ToLongTimeString verwenden) vom Typ Date ist und daher dort nicht verwendet werden dürfte.
    Und: Fange nur Exceptions ab, die Du kennst und sinnvoll bearbeiten kannst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Den Code habe ich jetzt mal in das "ServerEye" übernommen. Mal sehen was er jetzt sagt, Update folgt.
    Der "Testcode" lauft einmal beim klick auf "Start ServerEye" durch und dann alle 30 Minuten einmal. (Timer)

    Aktuell eigentlich gar nichts, weil kein Code überprüft ob der Prozess existiert, es wird ja quasi nur überprüft ob er aktiv ist oder nicht. Also das sollte eigentlich so sein aber irgendwie hat es bisher halt nicht geklappt.
    Der Prozess wird ja von mir oder vom Kollegen manuell auf allen Servern 1x gestartet, mit dem Code siehe oben wollen wir den Prozess wirklich nur Monitoren wie wahrscheinlich und wie oft er abstürzt. Das sehen wir dann ohne auf unseren 23 Servern raufgehen zu müssen in unseren Admintool. (Panelfarbe)

    Komischerweise wenn ich OptionStrict: On mache dann kann ich nicht mehr debuggen. Weil das ServerEye benötigt auch Adminausführung.

    €dit 12:45: @VaporiZed der Code von dir scheint nun zu funktionieren, darf ich von dir erfahren was der unterschied zu meinem ist? Das ich das verstehen kann.

    Grüße,
    Mike

    *Vollzitat komplett entfernt da unnötig* ~NoFear23m

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nofear23m“ ()

    Mikebazz schrieb:

    wenn ich OptionStrict: On mache dann kann ich nicht mehr debuggen
    Was meinst Du damit? Wie äußert sich das? Ich kann mir nur vorstellen, dass zig Fehler dort angezeigt werden, wo vorher scheinbar keine waren.
    Der Unterschied zwischen unseren beiden Codes ist: Du gehst jeden einzelnen Zielprozess durch. Wenn der zu prüfende nicht antwortet, wird eine Rot-Nachricht an den Server geschickt. Wenn einer antwortet, dann Grün. Wie erwähnt, hast Du durch die Microsoft-Nachricht einen Zielprozess mehr, der reagiert. Für den wird also Grün gemeldet. Wenn erst Rot gemeldet wird und dann gleich Grün, kann es sein, dass der Server nur das Grün sieht. Keine Ahnung. Spekulatius.
    Mein Code hingegen sagt: Dim AllProcessesRespond = Process.GetProcessesByName("XYZ").All(Function(x) x.Responding) -> "Nimm alle Zielprozesse und schreib True in die zurück, wenn alle Zielprozesse 'responden'". Also: Wenn auch nur ein einziger nicht responded, wird False in die Variable geschrieben. Und nur die Variable wird ausgewertet. Also nicht jeder Prozess einzeln, sondern quasi das Gesamtpaket wird ausgewertet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Mikebazz unterlasse das mit den Vollzitaten bitte, dies ist nicht erlaubt (siehe meine Edits) und versuche außerdem nur dann zu Zitieren wenn dies notwendig erscheint, das bedeutet wenn du in deiner Antwort auf einen gewissen Teil des Posts eingehen möchtest.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m ok

    @VaporiZed Danke für deine Erläuterung!
    Ich habe nun das "Update" auf allen Servern bei mir aufgespielt.
    Was würde oder soll laut deinen "Code" passieren wenn der Prozess gar nicht gestartet ist oder nicht existiert in diesen Moment?

    Weil auf einen Server da habe ich das Programm mit deinen ergänzten Code ebenso gestartet, er macht mir aber ein "grünes Licht" also Wert 1. Auf diesen gennanten Server lauft der Prozess aber gar nicht erst.
    Der Code ist ja eigentlich auf all responding ausgelegt, aber wenn der Prozess nicht existiert was responded dann? Wegen Wert 1.

    Grüße
    Wenn nichts passieren soll, wenn es den Prozess nicht gibt, dann eben als Anfang:

    VB.NET-Quellcode

    1. Dim AllTargetProcesses = Process.GetProcessesByName("XYZ")
    2. If AllTargetProcesses.Count = 0 Then Return
    3. Dim AllProcessesRespond = AllTargetProcesses.All(Function(x) x.Responding)
    4. If Not AllProcessesRespond Then
    5. 'und sonst wie bisher
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.