2016-06-06 7 views
0

Ich habe einen einfachen Syslog-Empfänger, der als Windows-Dienst gestartet wird. Der Service fängt gut an ... aber ich kann es nicht stoppen, wenn ich auf "Service stoppen" klicke. Ich bin mir sicher, dass es daran liegt, dass ich an einen Sockel gebunden bin. Ich kann jedoch nicht herausfinden, wie die Bindung von der SvcStop-Funktion an einen Socket aufgehoben wird. Hat jemand Ideen?Python, Windows-Dienst beenden (vom Socket trennen)

OUTPUT_LOG_FILE = 'C:\temp\output.log' 
HOST = "192.168.X.X" 
PORT = 514 
import SocketServer 
import pythoncom 
import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 

class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Simple Syslog Receiver" 
    _svc_display_name_ = "Simple Syslog Receiver" 
    server = "" 

    def __init__(self, args): 
     win32serviceutil.ServiceFramework.__init__(self, args) 
     self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 
     socket.setdefaulttimeout(60) 

    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.main() 

    def main(self): 
     try: 
      global server 
      server = SocketServer.UDPServer((HOST, PORT), SyslogUDPHandler) 
      server.serve_forever(poll_interval=0.5) 
     except (IOError, SystemExit): 
      raise 
     pass 



class SyslogUDPHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     data = bytes.decode(self.request[0].strip()) 

     with open(OUTPUT_LOG_FILE, 'w+') as outputfile: 
      outputfile.write(str(data)) 
     outputfile.close() 

if __name__ == "__main__": 
    win32serviceutil.HandleCommandLine(AppServerSvc) 
+0

Wenn Sie den Dienst beenden müssen Sie den Server aufrufen [ 'shutdown'] (https://docs.python.org/2/library/socketserver.html#SocketServer.BaseServer.shutdown) -Methode. – eryksun

Antwort

0

Das gleiche Problem auf Windows 7 + VirtualBox.

Die einzige Lösung, die ich habe, ist diesen bestimmten Port aus Weiterleitung in VirtualBox zu entfernen, oder verwenden Sie einen neuen Port.

Auch der Standard-Socket-Server-Code von einfachem Beispiel hat diese Funktion: 1. Es läuft immer 2. Sie es nicht in den Fenstern sehen verarbeitet 3. Es ist nicht „weil es an eine Steckdose begrenzt“, wie Es wird weiterhin korrekt wiedergegeben, obwohl die Python-Anwendung geschlossen ist.

import socket 

    TCP_IP = '127.0.0.1' 
    TCP_PORT = 80 
    BUFFER_SIZE = 20 

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((TCP_IP, TCP_PORT)) 
    s.listen(1) 

    conn, addr = s.accept() 
    print 'Connection address:', addr 
    while 1: 
     data = conn.recv(BUFFER_SIZE) 
     if not data: break 
     print "received data:", data 
     conn.send(data) # echo 

    conn.close() 
    s.close() 
    raw_input()