Python 可作为 Windows 服务执行
Python executable as Windows Service
我知道 Whosebug 上有与此类似的主题,但其中 none 有与我相同的问题。大多数问题都在询问如何从 Python 开始服务。我有一个正在创建服务的 .bat 文件,并使用我使用 py2exe 创建的 PythonFile.exe。我收到错误 "Error starting service. The service did not respond to the start or control request in a timely fashion"。该服务没有 运行,但我在 ProcessManager 进程中看到了可执行文件。
要使可执行文件符合服务资格,是否有特定要求?我的可执行文件只是一个 TCP 服务器,它会休眠(使用互斥量)直到互斥量被解锁。
我的 .bat 文件...
net stop "FabulousAndOutrageousOinkers"
%SYSTEMROOT%\system32\sc.exe delete "FabulousAndOutrageousOinkers"
%SYSTEMROOT%\system32\sc.exe create "FabulousAndOutrageousOinkers" binPath= "%CD%\FabulousAndOutrageousOinkers.exe" start= auto
net start "FabulousAndOutrageousOinkers"
我最终找到了问题的答案。事实上,服务是有要求的。大多数成为服务的脚本或程序在代码之上都有一个包装层来管理处理这些需求。这个包装器最终会调用开发人员的代码,并用不同类型的状态向 windows 服务发送信号。开始、停止等...
import win32service
import win32serviceutil
import win32event
class Service(win32serviceutil.ServiceFramework):
# you can NET START/STOP the service by the following name
_svc_name_ = "FabulousAndOutrageousOinkers"
# this text shows up as the service name in the Service
# Control Manager (SCM)
_svc_display_name_ = "Fabulous And Outrageous Oinkers"
# this text shows up as the description in the SCM
_svc_description_ = "Truly truly outrageous"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self,args)
# create an event to listen for stop requests on
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
# core logic of the service
def SvcDoRun(self):
import servicemanager
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
self.start()
rc = None
# if the stop event hasn't been fired keep looping
while rc != win32event.WAIT_OBJECT_0:
# block for 5 seconds and listen for a stop event
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
self.stop()
# called when we're being shut down
def SvcStop(self):
# tell the SCM we're shutting down
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
# fire the stop event
win32event.SetEvent(self.hWaitStop)
def start(self):
try:
file_path = "FabulousAndOutrageousOinkers.exe"
execfile(file_path) #Execute the script
except:
pass
def stop(self):
pass
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(Service)
我从 http://www.chrisumbel.com/article/windows_services_in_python 找到了这个模板。这段代码仍然存在一些问题,因为我收到错误 "Error starting service: The service did not respond to the start or control request in a timely fashion",但它仍然回答了我的问题。事实上,可执行文件需要成为 Windows 服务。
我知道 Whosebug 上有与此类似的主题,但其中 none 有与我相同的问题。大多数问题都在询问如何从 Python 开始服务。我有一个正在创建服务的 .bat 文件,并使用我使用 py2exe 创建的 PythonFile.exe。我收到错误 "Error starting service. The service did not respond to the start or control request in a timely fashion"。该服务没有 运行,但我在 ProcessManager 进程中看到了可执行文件。
要使可执行文件符合服务资格,是否有特定要求?我的可执行文件只是一个 TCP 服务器,它会休眠(使用互斥量)直到互斥量被解锁。
我的 .bat 文件...
net stop "FabulousAndOutrageousOinkers"
%SYSTEMROOT%\system32\sc.exe delete "FabulousAndOutrageousOinkers"
%SYSTEMROOT%\system32\sc.exe create "FabulousAndOutrageousOinkers" binPath= "%CD%\FabulousAndOutrageousOinkers.exe" start= auto
net start "FabulousAndOutrageousOinkers"
我最终找到了问题的答案。事实上,服务是有要求的。大多数成为服务的脚本或程序在代码之上都有一个包装层来管理处理这些需求。这个包装器最终会调用开发人员的代码,并用不同类型的状态向 windows 服务发送信号。开始、停止等...
import win32service
import win32serviceutil
import win32event
class Service(win32serviceutil.ServiceFramework):
# you can NET START/STOP the service by the following name
_svc_name_ = "FabulousAndOutrageousOinkers"
# this text shows up as the service name in the Service
# Control Manager (SCM)
_svc_display_name_ = "Fabulous And Outrageous Oinkers"
# this text shows up as the description in the SCM
_svc_description_ = "Truly truly outrageous"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self,args)
# create an event to listen for stop requests on
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
# core logic of the service
def SvcDoRun(self):
import servicemanager
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
self.start()
rc = None
# if the stop event hasn't been fired keep looping
while rc != win32event.WAIT_OBJECT_0:
# block for 5 seconds and listen for a stop event
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
self.stop()
# called when we're being shut down
def SvcStop(self):
# tell the SCM we're shutting down
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
# fire the stop event
win32event.SetEvent(self.hWaitStop)
def start(self):
try:
file_path = "FabulousAndOutrageousOinkers.exe"
execfile(file_path) #Execute the script
except:
pass
def stop(self):
pass
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(Service)
我从 http://www.chrisumbel.com/article/windows_services_in_python 找到了这个模板。这段代码仍然存在一些问题,因为我收到错误 "Error starting service: The service did not respond to the start or control request in a timely fashion",但它仍然回答了我的问题。事实上,可执行文件需要成为 Windows 服务。