Seite 1 von 1

Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Dienstag 14. April 2015, 10:30
von TechnoFeather
Hallo an alle.

Ich habe mehrere PCs/Renderclients auf denen nur Windows8 64Bit und ein Programm läuft, welches bei Bedarf Bilder berechnen soll. Das Programm stürzt nur leider gerne mal ab. Entweder das Programm verschwindet einfach oder es wird eine Fehlermeldung (Eingabefenster) ausgegeben welches man mit OK bestätigen muss, damit man das Programm manuell Neustarten kann.

Was mir derzeit also enorm helfen würde wäre ein Skript, welches prüft, ob ein Prozess geöffnet ist und ob das Fenster im Prozess "Plugin Error" vorhanden ist.

Wenn Prozess nicht vorhanden: Programm starten.
Wenn Fenster "Plugin Error" vorhanden: Programm beenden und neu starten.

Überprüfen muss das Skript den Prozess nur einmal alle ca. 2-3 Minuten mal.

Wie würdet ihr das am besten lösen? Vor allem das nicht irgendwann der Speicher der Überprüfung vollläuft oder so? Das Skript soll schon mehrere Monate durchlaufen, da die Renderclients in der Regel nicht neu gestartet werden müssen. Könnte man zwar so machen, wenn der Prozess eben nicht mehr läuft oder reagiert - ist aber natürlich nicht die feinste Lösung.

Angefangen hätte ich jetzt so:

Code: Alles auswählen

import time 
TRCpath = "C:\\Program Files\\......"
TRCexe = "TeamRenderClient.exe"
TRCerror = "Plugin Error"
while True:
    #check if TRCexe isn't running 
        #open TRCpath/TRCexe 

    time.sleep(10) # let TRC some time to open

    #check if window TRCerror in TRCexe is open
        #restart TRCexe  

    time.sleep(170) 

Re: Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Dienstag 14. April 2015, 10:43
von BlackJack
@TechnoFeather: Der Wenn man das vorhandensein des Prozesses auch über ein vorhandenes Fenster prüfen kann würde ich mal `pywinauto` anschauen. Ansonsten zum testen ob der Prozess läuft das `psutils`-Modul und nur für das Fehlerfenster `pywinauto`.

Re: Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Dienstag 14. April 2015, 14:04
von TechnoFeather
Habe soeben Python 3 installiert, welches scheinbar nicht mit pywinauto funktioniert. Auch Py2exe funktioniert so nicht. Ich installier dann mal 2.7.9....

...Webseiten der Addons für pywinauto sind auch offline, so dass ich es noch nicht installieren kann.

Re: Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Mittwoch 15. April 2015, 13:52
von TechnoFeather
So, als python-Datei funktioniert das ganze schonmal:

Code: Alles auswählen

import time, datetime
import pywinauto
import os.path
import sys
import psutil

TRCexe = "Client.exe"
TRCpath = "C:\\Program Files\\.......\\"
altTRCpath = "C:\\Program Files\\..........\\"
TRCerror = "Plugin Error"
app = pywinauto.application.Application()

def startTRC(path):
    print "\nStarting application...\n",
#    startTRC = app.start_([path])
#    while not app.Windows_():
#        time.sleep(.5)
#        sys.stdout.write('.')
#    print "\n\nDone!"

    startTRC = psutil.Popen([path])
    return
    
def TRCrunning():
    for p in psutil.process_iter():
        try:
            if p.name() == TRCexe:
                return True
        except psutil.AccessDenied:
            tempvar = psutil.AccessDenied ##hier muss ich etwas angeben, da ich sonst accessDenied Fehler bekomme. 
    return False

def Main():
    if os.path.isfile(TRCpath+TRCexe):
        path = TRCpath+TRCexe
    elif os.path.isfile(altTRCpath+TRCexe):
        path = altTRCpath+TRCexe
    else:
        print "Application does not exist! Exiting..."
        return
    print "TRC path found:"
    print path

    while True:
        timestamp = datetime.datetime.now().strftime("%d-%m-%Y  %H:%M:%S")
        #print "---------------------------------------------------------------"
        if TRCrunning():
            print timestamp, ": Team Render is running. Checking... "
            if pywinauto.findwindows.find_windows(title=TRCerror):
                sys.stdout.write("Error found. Restarting...")
                os.system("Taskkill /im", TRCexe, "/T /F")
                startTRC(path)
            sys.stdout.write("All ok. Will check again in 3 Minutes...")
        else:
            print timestamp, ": TRC is not running."
            startTRC(path)
        time.sleep(180)

if __name__ == "__main__":
    Main()
Das ganze ist allerdings garantiert noch verbesserungswürdig.

Als exe-Datei bekomme ich es allerdings nicht zum laufen (über Py2exe). Da bekomme ich folgende Fehlermeldung:

Traceback (most recent call last):
File "KeepTRCalive.py", line 3, in <module>
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\__init__.pyc", line 28, in <module>
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\findwindows.pyc", line 37, in <module>
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\controls\__init__.pyc", line 33, in <module>
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\controls\win32_controls.pyc", line 37, in <module>
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\tests\__init__.pyc", line 153, in <module>
File "pywinauto\tests\__init__.pyc", line 137, in __init_tests
ImportError: No module named allcontrols

hat jemand noch eine Idee hierzu?

Re: Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Mittwoch 15. April 2015, 13:57
von BlackJack

Re: Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Mittwoch 15. April 2015, 15:10
von TechnoFeather
Jein, .... doch ich denke schon. Jetzt gibt es andere Fehler, aber ich bin auf dem richtig Weg damit. Danke!

Re: Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Mittwoch 15. April 2015, 15:36
von TechnoFeather
WOW Es funktioniert! Danke für die Hilfe! :D

Ich musste viele DLLs ausschließen, warum erschließt sich mir grade nicht so recht, aber hier ist die setup.py von py2exe die für mich funkioniert:

Code: Alles auswählen

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options=
    {
        "py2exe":
        {
            "bundle_files": 1,
            "includes":
            [
                "pywinauto.tests.truncation",
                "pywinauto.tests.translation",
                "pywinauto.tests.repeatedhotkey",
                "pywinauto.tests.overlapping",
                "pywinauto.tests.missingextrastring",
                "pywinauto.tests.missalignment",
                "pywinauto.tests.miscvalues",
                "pywinauto.tests.leadtrailspaces",
                "pywinauto.tests.comparetoreffont",
                "pywinauto.tests.comboboxdroppedheight",
                "pywinauto.tests.asianhotkey",
                "pywinauto.tests.allcontrols",
            ],
            "dll_excludes":
            [
                "mswsock.dll",
                "powrprof.dll",
                "user32.dll",
                "shell32.dll",
                "wsock32.dll",
                "advapi32.dll",
                "kernel32.dll",
                "ntwdblib.dll",
                "ws2_32.dll",
                "oleaut32.dll",
                "ole32.dll",
                "IPHLPAPI.DLL",
                "NSI.dll",
                "WINNSI.DLL",
                "WTSAPI32.dll"
            ]
        }
    },
    windows = [{'script': "myScript.py"}],
    zipfile = None,
)

Re: Überprüfen ob Prozess läuft und Fenster geöffnet ist

Verfasst: Mittwoch 15. April 2015, 16:02
von BlackJack
@TechnoFeather: Also ein paar davon sehen nach Windows-DLLs aus, also solche die direkt mit dem Betriebssystem kommen.