Python 3 Windows Service starter kun i fejlsøgningstilstand

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har først sendt et svar i dette indlæg, men det var ikke i overensstemmelse med forumstandarderne. Jeg håber, at denne tid skal svare til forumstandarderne. Denne kode skal være mere klar og nem at læse.


I Python 3+ har jeg følgende klasse, som jeg bruger til at opbygge en Windows Service (det gør ingenting, skriver bare en logfil):


#MyWindowsService.py
import win32serviceutil
import servicemanager
import win32service
import win32event
import sys
import logging
import win32api


class MyWindowsService(win32serviceutil.ServiceFramework):
    \_svc\_name\_          = 'ServiceName'
    \_svc\_display\_name\_  = 'Service Display Name'
    \_svc\_description\_   = 'Service Full Description'
    logging.basicConfig(
        filename    = 'c:\Temp\{}.log'.format(\_svc\_name\_),
        level       = logging.DEBUG,
        format      = '\%(levelname)-7.7s @ \%(asctime)s: \%(message)s'
    )

    def \_\_init\_\_(self, *args):
        self.log('Initializing service {}'.format(self.\_svc\_name\_))
        win32serviceutil.ServiceFramework.\_\_init\_\_(self, *args)
        self.stop\_event = win32event.CreateEvent(None, 0, 0, None)

    def SvcDoRun(self):
        self.ReportServiceStatus(win32service.SERVICE\_START\_PENDING)
        try:
            self.log('START: Service start')
            self.ReportServiceStatus(win32service.SERVICE\_RUNNING)
            self.start()
            win32event.WaitForSingleObject(self.stop\_event, win32event.INFINITE)
        except Exception as e:
            self.log('Exception: {}'.format(e))
            self.SvcStop()

    def SvcStop(self):
        self.log('STOP: Service stopping...')
        self.ReportServiceStatus(win32service.SERVICE\_STOP\_PENDING)
        self.stop()
        win32event.SetEvent(self.stop\_event)
        self.ReportServiceStatus(win32service.SERVICE\_STOPPED)

    def log(self, msg):
        servicemanager.LogInfoMsg(str(msg))  #system log
        logging.info(str(msg))               #text log

    def start(self):
        self.runflag = True
        while self.runflag:
            win32api.Sleep((2*1000), True)
            self.log('Service alive')
    def stop(self): 
        self.runflag = False
        self.log('Stop received')




if \_\_name\_\_ == '\_\_main\_\_':
    win32serviceutil.HandleCommandLine(MyWindowsService)


I scriptet bruger jeg en logfil til at kontrollere, om det virker korrekt. Jeg kører python3.6 (også prøvet med python3.4) på ​​Windows 7 og jeg oplever følgende problem. Når jeg kører python MyWindowsService.py install prompten siger, at tjenesten er installeret (men der er ikke skrevet noget i logfilen). Hvis jeg forsøger at starte tjenesten, får jeg Service Fejl: 1 - Mere info NET HELPMSG 3547, som ikke siger meget om fejl. Hvis jeg kører python MyWindowsService.py debug, kører programmet fint (logfilen er skrevet), men jeg har stadig ingen kontrol over tjenesten: Hvis jeg åbner en anden prompt og forsøger at stoppe/starte tjenesten, er jeg stadig fik de samme resultater som angivet ovenfor.


Jeg prøvede også at indsætte nogle fejlkode i init -funktionen, og når jeg kører python MyWindowsService.py installerer det tilsyneladende det ikke bliver kaldt. Er det muligt?


Jeg har kontrolleret flere løsninger og løsninger rundt om nettet, men jeg fandt ikke noget passende. Hvad mangler jeg?

Bedste reference


Som påpeget af eriksun i kommentar til det første indlæg, kom problemet fra placeringen af ​​python scriptet, der var i et drev kortlagt med en UNC-sti. Jeg arbejder med en virtuel maskine. Flytter python scriptet i samme drev som python installationen gjorde jobbet.
For at opsummere det til fremtidige anvendelser, hvis tjenesten ikke starter, og du er temmelig sikker på din kode, er det nyttige handlinger for at forsøge at løse dine problemer:



  • brug sc start ServiceName, sc query ServiceName og sc stop ServiceName for at få oplysninger om tjenesten.

  • Kontroller, om din fil er i et fysisk drev eller i et UNC-kortlagt drev. Hvis sidstnævnte forsøger at køre scriptet ved hjælp af UNC-stien (for eksempel python \Serversharepythonyour-folderscript.py) eller flyt dit script i samme drev som pythoninstallationen

  • Sørg for at 'python36.dll', 'vcruntime140.dll' og 'pywintypes36.dll' enten er symlink 'd til den mappe, der har PythonService.exe; eller symlink' d til System32-mappen; eller at katalogerne med disse DLL'er er i systemet (ikke bruger) -banen

  • Kontroller systemregistret med kommando reg query HKLMSystemCurrentControlSetServicesyour\_service\_name /s for at få flere oplysninger om scriptet



PLease, følg fri til at gennemføre, ændre, modificere det sidste, så det kan være nyttigt for alle, der ligesom mig, støder på dette problem.


EDIT: En ting mere ... Mit projekt var tænkt at arbejde faktisk med netværksmapper (og UNC-mapped drive), og det mislykkedes, da jeg forsøgte at få det til at fungere som service. En meget nyttig (dagbesparende) ressource, som jeg plejede at få det til at fungere, er SysinternalsSuite af Mark Russinovich, som jeg fandt i dette indlæg. Håber dette hjælper. [10]