[VB.Net 2010] Programm überwachen

06/24/2012 00:16 Napf#1
Hallo zusammen,
ich stelle heute mal keine Frage sondern möchte euch etwas zur verfügung stellen.

Ich nutze für meinen Windows Server 2008 ein selbstprogrammiertes Programm welches mir erlaubt Programme zu überwachen, Laufen sie? Geben sie keine Rückmeldung mehr?

Stürzt ein Programm ab, oder meldet sich nciht mehr (Keine rückmeldung),
startet mein Programm das Programm neu und sendet eine Mail an Empfänger XXXXXX

Es ist ein kleiner übersichtlicher Code, leicht selbst zu Programmieren.

Hier für euch der Code, eine oberfläche müsst ihr euch selbst zusammenbasteln.

Es ist Windows Forms, vergesst die label nicht und den Button sonst bekommt ihr einen Fehler.

Es ist euch erlaubt den Code zu nutzen, verändern oder zu erweitern wie ihr wollt.


Viel spass damit, ich würde mich über ein "Thanks" freuen ;)

Code:
Option Strict On
Imports System.Net.Mail

Public Class Form1

    Private t As New Threading.Thread(AddressOf Thread)
    Private p As New Process()
    Private test, erfolg, fehlg, neu As Integer


    Private Sub Thread()

        'Hier gebt ihr an welches Programm überwacht werden soll. Versucht alles aus zu füllen. Wenn ihr keine Startargumente benötigt nehmt es ganz heraus.
        '
        p.StartInfo.FileName = ""
        p.StartInfo.WorkingDirectory = ""
        p.StartInfo.Arguments = ""
        p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
        p.Start()

        'Das ist die Zeit bis zum 1. Test in ms, diese Zeit sollte min. 1 Minute betragen, da ein
        'Programm sich beim starten gern nciht zurückmeldet
        Threading.Thread.Sleep(60000)

        While True

            test = test + 1
            Me.Invoke(Sub() Label4.Text = test.ToString)

            If Not p.Responding Then
                Try
                    p.Kill()
                    p.Start()

                    neu = neu + 1
                    Me.Invoke(Sub() Label7.Text = neu.ToString)

                Catch ex As InvalidOperationException
                    p.Start()

                    neu = neu + 1
                    Me.Invoke(Sub() Label7.Text = neu.ToString)

                Catch ex As Exception

                    MessageBox.Show(ex.Message & vbCrLf & ex.StackTrace)

                End Try

                fehlg = fehlg + 1
                Me.Invoke(Sub() Label6.Text = fehlg.ToString)

                'Mail - Hier tragt ihr eure Maildaten ein damit das Programm euch eine Mail sendet falls ein Problem auftritt!
                '
                Dim Msg As New MailMessage
                Dim myCredentials As New System.Net.NetworkCredential
                myCredentials.UserName = "EURE MAIL ADRESSE"
                myCredentials.Password = "EUER PASSWORT"

                Msg.IsBodyHtml = False

                Dim mySmtpsvr As New SmtpClient()
                mySmtpsvr.Host = "SMTP SERVER"
                mySmtpsvr.Port = 25

                mySmtpsvr.UseDefaultCredentials = False
                mySmtpsvr.Credentials = myCredentials


                Msg.From = New MailAddress("ABSENDER")
                Msg.To.Add("EMPFÄNGER")
                Msg.Subject = "BETREFF"
                Msg.Body = "Unerwarteter Neustart - Programm wurde Neugestartet" & vbCrLf & "Getestet: " & test & vbCrLf & "Erfolg: " & erfolg & vbCrLf & "Fehlgeschlagen: " & fehlg & vbCrLf & "Neugestartet: " & neu & _
                    vbCrLf & vbCrLf & "Bitte prüfe das Programm auf Fehler falls es in letzter Zeit häufiger auftritt!"
                mySmtpsvr.Send(Msg)


                'Das ist die Zeit bis zum 1. Test in ms, diese Zeit sollte min. 1 Minute betragen, da ein
                'Programm sich beim starten gern nciht zurückmeldet
                Threading.Thread.Sleep(60000)

            Else

                erfolg = erfolg + 1
                Me.Invoke(Sub() Label5.Text = erfolg.ToString)

            End If

            'Hier trag ihr ein das alle X ms geprüft werden soll. 1500 sind 1,5 sek.
            '
            Threading.Thread.Sleep(1500)

        End While

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        t.Start()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        If t.IsAlive Then
            t.Abort()
        End If

    End Sub

End Class