在win32serviceutil.HandleCommandLine(服务)中使用python引发异常创建的windows服务

2024-09-27 07:31:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾尝试使用jupyter笔记本中的以下代码创建windows服务,但在执行HandleCommandLine方法时出错。 以下是例外

import win32service, win32serviceutil, win32api, win32con, win32event, win32evtlogutil
import psutil
import subprocess
import os, sys, string, time, socket, signal
import servicemanager

class Service (win32serviceutil.ServiceFramework):
    _svc_name_ = "Service"
    _svc_display_name_ = "Service"

    def __init__(self,args):
        print("init")
        win32serviceutil.ServiceFramework.__init__(self, *args)
        self.log('Service Initialized.')
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        print("init completed")


    def log(self, msg):
        print("log")
        servicemanager.LogInfoMsg(str(msg))
        print("log")

    def sleep(self, sec):
        print("sleep")
        win32api.Sleep(sec*1000, True)
        print("sleep completed")

    def SvcStop(self):
        print("SvcStop")
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.stop()
        self.log('Service has stopped.')
        win32event.SetEvent(self.stop_event)
        self.ReportServiceStatus(win32service.SERVICE_STOPPED)
        print("SvcStop completed")

    def SvcDoRun(self):
        self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
        try:
            self.ReportServiceStatus(win32service.SERVICE_RUNNING)
            self.log('Service is starting.')
            self.main()
            win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
            servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_, ''))
        except Exception as e:
            s = str(e);
            self.log('Exception :'+s)
            self.SvcStop()

    def stop(self):
        self.runflag=False
        try:
            print('Hi')
        except Exception as e:
            self.log(str(e))

    def main(self):
        self.runflag=True
        while self.runflag:
            rc = win32event.WaitForSingleObject(self.stop_event, 24*60*60)
            # Check to see if self.hWaitStop happened
            if rc == win32event.WAIT_OBJECT_0:
                self.log("Service has stopped")
                break
            else:
                try:
                    print('hi')
                except Exception as e:
                    self.log(str(e))

if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(Service)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        print('-main-')
        win32serviceutil.HandleCommandLine(Service)
        print('-main completed-')

选项-f未被识别 用法:“ipykernel_launcher.py[选项]安装|更新|删除|启动[…]|停止|重新启动[…]|调试[…]” 仅适用于“安装”和“更新”命令的选项: --用户名域\用户名:运行服务的用户名 --密码:用户名的密码 --启动[手动|自动|禁用|延迟]:服务如何启动,默认值=手动 --交互式:允许服务与桌面交互。 --perfmonini文件:。用于注册性能监视器数据的ini文件 --perfmondll文件:。查询服务时要使用的dll文件 性能数据,默认值=perfmondata.dll 仅“启动”和“停止”命令的选项: --等待秒:等待服务实际启动或停止。 如果使用“stop”选项指定--wait,则服务 所有相关服务都将停止,每个服务都将等待 指定的期间。 发生异常,请使用%tb查看完整回溯

系统出口:1


Tags: importselflogmaindef选项serviceutil

热门问题