Prozesse beenden die von externem Script gestartet wurden

  • Um gewisse Dinge zu paralelisieren arbeite ich mit mehreren Scripten die wiederum externe Programme starten.

    Script1 startet Script 2.
    Script 2 startet ein nicht selbstgeschriebenes Programm.
    Script 2 wartet auf das gestartete Programm.

    Nun kommt in Script1 eine Stelle die es dem Benutzer erlaubt Script 2 per processclose zu beenden. Dies ist notwendig falls das von Script2 gestartete Programm fehlerhaft arbeitet.
    Damit erreiche ich zwar, dass Script1 weiter arbeitet, jedoch läuft das von Script 2 gestartete Programm noch. Das führt dann zu Problemen wenn Script1 erneut ausgeführt werden soll.

    Gibt es eine Möglichkeit alle Prozesse die von Script 2 gestartet wurden zeitgleich mit Script 2 zu beenden? (Also alle untergeordneten Prozesse)
    Leider funktioniert processclose für das Programm aus Script1 heraus nicht, da der Name des gestarteten Programms nicht eindeutig (es existieren noch andere Instanzen die nicht beendet werden sollen) und eine PID nicht vorhanden ist, diese ist nur Script2 bekannt, welches ja bereits beendet wurde.

    Welche Möglichkeiten habe ich in diesem Fall? Muss ich dafür sorgen dass Script2 die PID aller Unterprozesse an Script1 übermittelt oder gibt es bessere Möglichkeiten?

    2 Mal editiert, zuletzt von misterspeed (10. März 2013 um 17:23)

  • Ich würde einfach Script 2 die PID des gestarteten Programmes in eine Ini schreiben lassen und dann diese mit Script 1 bei Bedarf auslesen um das Programm zu beenden.

    Also so:

    Script 2:

    Spoiler anzeigen
    [autoit]

    $pid = Run("programm.exe")
    IniWrite("temp", "programm", "pid", $pid)

    [/autoit]

    Script 1:

    Spoiler anzeigen
    [autoit]

    $pid_script2 = Run("script2.exe")
    If ProcessExists($pid_script2) Then
    ProcessClose($pid_script2)
    ProcessWaitClose($pid_script2)
    EndIf

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

    $pid = IniRead("temp", "programm", "pid", "")
    If ProcessExists($pid) Then
    ProcessClose($pid)
    ProcessWaitClose($pid)
    EndIf

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Moin,

    Script 2 ist ja anscheinend ein AU3-Script. Statt ProcessClose() könntest Du vielleicht auch WinClose() verwenden. Dann könnte sich das Script selbst ums "Aufräumen" kümmern.

  • Winclose für script 2 dürfte nicht funktionieren, da die GUI im msgloop Modus arbeitet und das Script zum fraglichen Zeitpunkt noch unsichtbar ist und sich ausserhalb der GUI Schleife befindet. Gelegentlich kommt es vor, dass das Programm nicht mehr reagiert und dadurch Script 2 blockiert. Script 1 soll nach einem Timeout beide Prozesse beenden können um das ganze erneut zu versuchen. Es handelt sich also mehr oder weniger um ein Worst Case Scenario mit 2 nicht mehr ansprechbaren Programmen, bzw. soll ein nich mehr reagierendes Script 2 grundsätzlich abgefangen werden können. Da wäre es fatal sich auf das eigenständige Aufräumen von Script 2 zu verlassen.

    Aber wenn ihr auch keine direkte Möglichkeit kennt um aus Script 1 heraus alle Unterprozesse von Script 2 zu beenden werd ich wohl die ini/textdatei Lösung mit PID Übergabe verwenden. Das ist zwar nicht schön, dürfte aber funktionieren.