Unable to run Python script as a WinService [Error starting service: The service did not respond to the start or control request in a timely fashion.]

26 views Asked by At

I have created a basic logger script as below:

import logging
import json
import datetime
import os
from logging.handlers import TimedRotatingFileHandler

def _create_logger():
    if not os.path.exists('C:\\Users\\jimjakik\\Downloads\\DemoService'):
        os.makedirs('C:\\Users\\jimjakik\\Downloads\\DemoService')

    fh = TimedRotatingFileHandler(        
        filename=f"C:\\Users\\jimjakik\\Downloads\\DemoService\\log{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}.txt",
        when="s",
        interval=5,
        backupCount=0,        
        #atTime=datetime.time(0, 0)
    )

    formatter = logging.Formatter(json.dumps(LOGGING_FORMAT))
    fh.setFormatter(formatter)

    logger = logging.getLogger('')
    logger.setLevel(logging.INFO)
    logger.addHandler(fh)
 
    return logger

LOGGING_FORMAT = {
    "timestamp": "%(asctime)s",
    "name": "%(name)s",
    "level": "%(levelname)s", 
    "message": "%(message)s"
}

logger = _create_logger()

Which I'm calling in service.py as below:

import win32serviceutil
import win32service
import win32event
import fileio
import sys

class Service(win32serviceutil.ServiceFramework):
    _svc_name_ = "DemoService"
    _svc_display_name_ = "Python Demo Service"
    
    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.event = win32event.CreateEvent(None, 0, 0, None)
    
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.event)
    
    def SvcDoRun(self):
        import servicemanager
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        while True:
            
            self.main()

            if win32event.WaitForSingleObject(self.event, 5000) == win32event.WAIT_OBJECT_0:
                break
    
    def main(self):
        fileio.logger.info('Running')

def install():
    win32serviceutil.HandleCommandLine(Service)

My setup.py file is as below: from setuptools import setup, find_packages

setup(
    name='DemoService',
    version='1.0',
    description='Python Demo Service',
    author='jimjakik',
    install_requires=[
        'pywin32',
    ],
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'run_service = service.service:install',
        ],
    },
    classifiers=[
        'Operating System :: Microsoft :: Windows',
        'Programming Language :: Python :: 3',
    ],
)

I'm able to install setup.py using setuptools, but when I run it, I get below error: Error starting service: The service did not respond to the start or control request in a timely fashion.

Is there an issue in the scripts?

0

There are 0 answers