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)
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