80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
import win32service
|
|
import win32serviceutil
|
|
import win32api
|
|
import win32con
|
|
import win32event
|
|
import win32evtlogutil
|
|
import servicemanager
|
|
import os
|
|
import sys
|
|
from lib import const
|
|
from lib import common
|
|
from win32api import OutputDebugString as ODS
|
|
import traceback
|
|
|
|
|
|
const.SERVICENAME = "Test Service"
|
|
const.SERVICEDNAME = "Test Service"
|
|
const.SERVICEDESC = "Test Service Description"
|
|
|
|
const.CHILD = [
|
|
"C:\\Program Files\\Python36\\python.exe",
|
|
"C:\\pyvncs\\ctrlsrv.py",
|
|
"-P",
|
|
"kaka80"
|
|
]
|
|
|
|
class service(win32serviceutil.ServiceFramework):
|
|
|
|
_svc_name_ = const.SERVICENAME
|
|
_svc_display_name_ = const.SERVICEDNAME
|
|
_svc_description_ = const.SERVICEDESC
|
|
|
|
def __init__(self, args):
|
|
win32serviceutil.ServiceFramework.__init__(self, args)
|
|
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
|
|
|
|
def SvcStop(self):
|
|
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
|
|
win32event.SetEvent(self.hWaitStop)
|
|
|
|
def SvcDoRun(self):
|
|
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_, ''))
|
|
self.timeout = 3000
|
|
|
|
servicemanager.LogInfoMsg("%s - is running 1" % const.SERVICENAME)
|
|
r = common.proc()
|
|
try:
|
|
r.run(const.CHILD)
|
|
except:
|
|
servicemanager.LogInfoMsg("ERROR: %s" % sys.exc_info()[0])
|
|
servicemanager.LogInfoMsg(traceback.format_exc())
|
|
sys.exit(1)
|
|
|
|
newpid = r.getpid()
|
|
servicemanager.LogInfoMsg("%s - started child with pid %s" % (const.SERVICENAME, newpid))
|
|
|
|
while True:
|
|
# Wait for service stop signal, if I timeout, loop again
|
|
rc = win32event.WaitForSingleObject(self.hWaitStop, self.timeout)
|
|
# Check to see if self.hWaitStop happened
|
|
if rc == win32event.WAIT_OBJECT_0:
|
|
# Stop signal encountered
|
|
servicemanager.LogInfoMsg("%s - STOPPED" % const.SERVICENAME)
|
|
r.terminate()
|
|
break
|
|
#else:
|
|
# servicemanager.LogInfoMsg("%s - still running" % const.SERVICENAME)
|
|
|
|
|
|
def ctrlHandler(ctrlType):
|
|
return True
|
|
|
|
if __name__ == '__main__':
|
|
ODS("__main__\n")
|
|
servicemanager.LogInfoMsg("TEST")
|
|
appdir = os.path.abspath(os.path.dirname(sys.argv[0]))
|
|
os.chdir(appdir)
|
|
win32api.SetConsoleCtrlHandler(ctrlHandler, True)
|
|
win32serviceutil.HandleCommandLine(service)
|