Prozesse Starten und dann überwachen

  • Hallo zusammen,

    ich habe da ein Problem mit einem Script:

    Ich möchte folgendes tun:

    Das Script soll eine INI Lesen. Darin befinden sich eine Anzahl von Pfaden zu EXE Dateien. Das Script soll diese starten und anschließend periodisch prüfen ob die Prozesse des EXE Dateien noch exisieren. (Einige der Programme beenden sich nach einigen Minuten selbsttätig / Das ist in dem Fall ein normales Verhalten) Wenn dieser Fall eintriff = PID nicht mehr existent, soll das Script die EXE aus der INI erneut starten. Dieser "neustart" soll auf ein bestimmte Antzahl von Wiederholungen begrenz werden.

    Was ich bisher habe ist folgendes:

    Spoiler anzeigen

    Und natürlich eine INI - die zum Test jetzt erstmal so ausschaut:

    Spoiler anzeigen
    Code
    [global]
    app1=notepad.exe
    app2=notepad.exe

    Wo ich gerade nicht weiterkomme, ist der Punkt an dem ich die verschiedenen $PID Werte irgendwie speichern müsste.

    Vielen Dank für die Hilfe schonmal ...

    Grüße aus dem sonnigen Bremen
    subby

    Einmal editiert, zuletzt von substyle (15. April 2010 um 20:03)

  • so müsste auf jeden fall das überprüfen ob die programme noch laufen möglich sein

    Spoiler anzeigen
    [autoit]

    For $i = 1 To $var[0][0]
    If Not ProcessExists($var[$i][1])Then
    neustarteb oder was auch immer
    EndIf
    Next

    [/autoit]

    EDIT: ach habs gerade erst richtig verstanden du willst auch dass das selbe programm mehrmal aufgerufen wird?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (15. April 2010 um 16:58)

  • Hallo Darter,

    danke erstmal für die Idee:

    Ich möchte das jedes Programm nur ein Mal zu Zeit läuft. (Eine Instanz)
    Alle Programme aus der INI müssen "gleichzeitig" starten.
    Jedes Programm soll unabhängig wann es sich beendet maximal fünf mal neu gestartet werden.

    Jetzt alles verständlich ? :S Neige manchmal dazu etwas unklar zu schreiben ..

    Grüße
    subby

  • so vllt? ist ungetestet


    Spoiler anzeigen
    [autoit]


    dim $prozessstarts[10] ; muss natürlich je nach anzahl wie viele Programme du aufrufen willst mit angepasst werden. ich habe infach mal 10 genommen sprich es funktioniert solange bis 11 Programme geöffnet werden.
    $var = IniReadSection("test.ini", "global")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $var[0][0]
    Run (@WindowsDir & "\" & $var[$i][1])
    $prozessstarts[$i] = 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If @error Then
    MsgBox(4096, "", "INI kann nicht gelesen werden")
    Else

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $var[0][0]
    If Not ProcessExists($var[$i][1])Then
    If $prozessstarts[$i] < 6 Then
    Run (@WindowsDir & "\" & $var[$i][1])
    $prozessstarts[$i] += 1
    EndIf
    EndIf
    Next
    EndIf
    WEnd

    [/autoit]

    EDIT: ich würde dann wenn es funktioniert ^^ noch ein kleines slepp von vllt 100 millisec in die whileschleife einbauen

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    3 Mal editiert, zuletzt von Darter (15. April 2010 um 17:22)

  • Hallo Darter,

    danke für das Script. Aber ich glaube wir reden aneinander vorbei.

    Ich versuche es mal anders zu schreiben:

    Script Startet

    App_1 = PID 1475
    App_2 = PID 5478

    Nun prüft Script - gibt es PID 1475 und PID 5478 noch.
    Wenn ja - sleep.
    Wenn nein. (z.B. PID 5478 nicht da) startet das Script App_2 neu.
    App_2 gekommt die PID 4555 - welche das Script fortan überwacht.
    Script setzt den Counter eins rauf (maximale verbleibende Starts für App_2 = 4)

    Grüße
    subby

    P.S: Wenn das einer löst geb ich einen aus - :rock:

  • also so wie du es hier beschreibst ist es genau das was ich gemacht hab.

    Script startet

    überprüft ob Prozess1 oder Prozess 2 noch existiert wenn ja --nix
    wenn nein --> Startet den Prozess der nichtmehr existiert neu und setzt dessen counter auf 2,
    Ist nun ein Prozess schon 5 mal neugestartet wird er beim 6 mal nicht mehr gestartet.

    EDIT: habs jetzt extra getestet und bei mir tritt genau der iebn beschriebene fall ein. startet 3 programme. wenn ich eins schließe wird es wieder gestartet (max 5 mal)

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (15. April 2010 um 17:48)

  • Ja - die Logik sagt das so.

    Wenn das Script läuft passiert aber folgendes:

    Es starten 2x Notepad.
    Ein Notepad kann man beenden, und er startet kein 2. mal neu.
    Das zweite Notepad (letzte exe aus dem Array) wird duch die While Schleife 11x neu gestartet!

    Genau so soll es aber ja nicht sein.

    Ist das irgendwie klarer?
    subby

  • so müsste auf jeden fall das überprüfen ob die programme noch laufen möglich sein

    Spoiler anzeigen
    [autoit]

    For $i = 1 To $var[0][0]
    If Not ProcessExists($var[$i][1])Then
    neustarteb oder was auch immer
    EndIf
    Next

    [/autoit]

    EDIT: ach habs gerade erst richtig verstanden du willst auch dass das selbe programm mehrmal aufgerufen wird?

    deshalb habe ich dich vorher gefragt ob du ein Programm mehrmals startet willst. Ist doch klar dass es dann komplikationen gibt. Aber da du auf diese Frage mit nein geantwortet hast war das na nicht relevant.

    Das problem ist ja einfach bei meiner lösung, dass er nach dem Prozess sucht und wenn du 2 mal den gleichen aufhast ist klar das es nicht geht. willst du aber ein Programm mehrmal startet muss das natülich geändert werden.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Genau das war dann meine Frage. Ich glaube wir verstehen einander. Desshalb wollte ich den Prozess anhand seiner PID überprüfen. Das Problem ist nun, das ich in der

    Code
    For $i = 1 To $var[0][0]
    	   $PID = Run (@WindowsDir & "\" & $var[$i][1])
    Next

    Passage nur einmal $PID füllen kann. Das script läuft ja aber mehrmals durch die For-Schleife. Genau dort habe ich gehangen.

    subby

  • dann packs doch auch in ein array

    [autoit]

    Global $PID[20]
    For $i = 1 To $var[0][0]
    $PID[$i] = Run (@WindowsDir & "\" & $var[$i][1])
    Next

    [/autoit]

    so müsste es gehn

    Spoiler anzeigen
    [autoit]

    Global $prozessstarts[20]
    Global $PID[20]

    [/autoit] [autoit][/autoit] [autoit]

    $var = IniReadSection("test.ini", "global")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $var[0][0]
    $PID[$i] = Run (@WindowsDir & "\" & $var[$i][1])
    $prozessstarts[$i] = 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If @error Then
    MsgBox(4096, "", "INI kann nicht gelesen werden")
    Else

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $var[0][0]
    If Not ProcessExists($PID[$i])Then
    If $prozessstarts[$i] < 6 Then
    $PID[$i] = Run (@WindowsDir & "\" & $var[$i][1])
    $prozessstarts[$i] += 1
    EndIf
    EndIf
    Next
    EndIf
    WEnd

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Jaa - DAS war die Lösung! Holy Saver!

    Da bleibt mir kaum etwas ausser - vielen vielen Dank zu sagen. :thumbup:

    Ich hoffe ich kann mich eines Tages mal revanchieren. Bin ja noch am üben mit Autoit.

    Danke nochmal.

    subby