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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TechnoFeather
User
Beiträge: 20
Registriert: Freitag 24. Juli 2009, 11:07

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) 
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`.
TechnoFeather
User
Beiträge: 20
Registriert: Freitag 24. Juli 2009, 11:07

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.
TechnoFeather
User
Beiträge: 20
Registriert: Freitag 24. Juli 2009, 11:07

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?
TechnoFeather
User
Beiträge: 20
Registriert: Freitag 24. Juli 2009, 11:07

Jein, .... doch ich denke schon. Jetzt gibt es andere Fehler, aber ich bin auf dem richtig Weg damit. Danke!
TechnoFeather
User
Beiträge: 20
Registriert: Freitag 24. Juli 2009, 11:07

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,
)
BlackJack

@TechnoFeather: Also ein paar davon sehen nach Windows-DLLs aus, also solche die direkt mit dem Betriebssystem kommen.
Antworten