如何处理用python编写的windows服务中的信号?

时间:2014-01-22 16:28:54

标签: python windows service signals handler

我正在python中编写一个Windows服务。我把信号处理代码放在了 SvcDoRun()方法的服务。当我启动服务时,我在日志文件中得到以下异常: 例外:信号仅适用于主线程

以下是我的代码:

import pythoncom
import win32serviceutil
import win32service
import win32event
import socket 
import sys
sys.path.append("E:\\AnuntaTech\\SecondDrop")
from src.CPE.cpe import Cpe_MBus
from src.Utilities import atlogger
import threading
import os
import signal
'''
This is Thread subclass to wait on the MessageBus Channel for CPE
'''
class CpeThread(threading.Thread):

    def __init__(self,oCpeMbus):
        threading.Thread.__init__(self)
        self.oCpeMbus = oCpeMbus

    def run(self):
        self.oCpeMbus.mod.wait()
'''
this function is the signal handler to re-register on  the crash of MessageBus
'''            
def reRegisterSignalHandler(signum,frame):
    atlogger.info("in CpeMain : reRegisterSignalHandler()")
    atlogger.info("Re-registering CPE on MessageBus")
    oCpeMbus =   Cpe_MBus()   
    oCpeThread = CpeThread(oCpeMbus) 
    oCpeThread.start()
'''
this function is the signal handler to reboot CPE
'''            

def reBootSignalHandler(signum,frame):
    atlogger.info("In executorMain : reBootSignalHandler")
    # TODO: add-clean-up code
    os.kill(int(os.getpid()),signal.SIGKILL)


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

    def __init__(self,args):
        try :
            win32serviceutil.ServiceFramework.__init__(self,args)
            self.hWaitStop = win32event.CreateEvent(None,0,0,None)
            socket.setdefaulttimeout(60)
        except Exception as e:
            atlogger.info("Exception: %s",e)


    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.fStop = True
        return True
        #pass
        #self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        #win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        import servicemanager
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))

        self.fStop = False
        self.main()

    def main(self):
        try :
            f = open('E:\\test.txt','w')
            f.write("in cpeMain")
            f.close()
            try :
               signal.signal(signal.SIGILL,reRegisterSignalHandler) # registering the signal   handler
               signal.signal(signal.SIGTERM,reBootSignalHandler) # registering the signal handler
            except Exception as e :
               atlogger.info("Exception: %s",e)
            atlogger.info("This is CPE on Message Bus")
            #starting the CPE module
            oCpeMbus =   Cpe_MBus()   
            oCpeThread = CpeThread(oCpeMbus) 
            oCpeThread.start()
            atlogger.info("CPE regitration done on MessageBus")
        except Exception as e:
            atlogger.info("Exception: %s",e)
        while True:
            pass
if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

0 个答案:

没有答案