Python 服务因错误 1053 而失败,但可以在调试模式下工作
Python service fails with error 1053 but works with debug mode
我正在尝试从我的代码创建 Python 服务 .exe。
我坚持 运行 它。
我有2个重要文件:服务代码:
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import time
from mailbox.fetcher import main_fetching
from disc.my_logger import set_up_logging
logging = set_up_logging("Fetcher")
class FetcherSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "MailMan-FetchingService"
_svc_display_name_ = "MailMan FetchingService"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.stop_event = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
self.stop_requested = False
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.stop_event)
logging.info('Stopping fetching ...')
self.stop_requested = True
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,'')
)
self.main()
def main(self):
logging.info(' ** Starting fetching mails service ** ')
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
while not self.stop_requested:
main_fetching()
py2exe设置代码:
setup(console=[{"script": "fetching_service.py",
"icon_resources": [(1, "../mailman.ico")],
"dest_base": "fetching_service"}],
data_files=[('', ['../cacert.pem', '../trusted-certs.crt'])],
options={"py2exe": {
"includes": ["win32serviceutil", "win32service", "win32event"],
'bundle_files': 0, "optimize": 2,
'dist_dir': 'fetcher_service'}})
服务安装正确:
$ fetcher_service/fetching_service.exe --startup=delayed install
Installing service MailMan-FetchingService
Changing service configuration
Service updated
但在开始时:
$ fetcher_service/fetching_service.exe start
Starting service MailMan-FetchingService
Error starting service: Usługa nie odpowiada na sygnał uruchomienia lub sygnał sterujący w oczekiwanym czasie.
(翻译成英文:服务没有及时响应启动或控制请求)
我试过设置特定用户,但没有帮助......
此外:运行后立即发生错误,没有延迟
忘记补充:服务在调试模式下运行完美。
您必须发出信号 Windows 您的服务实际上是 运行。在SvcDoRun
里面,调用
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
并且一旦您的服务真正启动(例如,一旦您到达 main,甚至直接在之后)
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
将您的服务标记为已成功启动。
我已经解决了这个问题。
我使用了 phihag 的答案并自己更改了 setup.py:
setup(service=[{'modules':'fetching_service','cmdline_style':'pywin32','description':'your service description',
# console=[{"script": "fetching_service.py",
"icon_resources": [(1, "../mailman.ico")],
"dest_base": "fetching_service"}],
data_files=[('', ['../cacert.pem', '../trusted-certs.crt'])],
options={"py2exe": {
"includes": ["win32serviceutil", "win32service", "win32event"],
'bundle_files': 0, "optimize": 2,
'dist_dir': 'fetcher_service'}})
此问题可能是由损坏的 pywin32 安装引起的。使用 Sys Internals excellent procmon 我发现 pythonservice.exe 无法加载 pywintypes34.dll。 运行 c:\python34\scripts\pywin32_postinstall.py 解决了这个问题。注意,如果您因为使用 pip 而将 pywin32 安装为 pypiwin32,那么您需要修复 C:\Python34\Lib\site-packages\pypiwin32_system32
dir 为 C:\Python34\Lib\site-packages\pywin32_system32 以使脚本运行。
我正在尝试从我的代码创建 Python 服务 .exe。 我坚持 运行 它。
我有2个重要文件:服务代码:
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import time
from mailbox.fetcher import main_fetching
from disc.my_logger import set_up_logging
logging = set_up_logging("Fetcher")
class FetcherSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "MailMan-FetchingService"
_svc_display_name_ = "MailMan FetchingService"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.stop_event = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
self.stop_requested = False
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.stop_event)
logging.info('Stopping fetching ...')
self.stop_requested = True
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,'')
)
self.main()
def main(self):
logging.info(' ** Starting fetching mails service ** ')
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
while not self.stop_requested:
main_fetching()
py2exe设置代码:
setup(console=[{"script": "fetching_service.py",
"icon_resources": [(1, "../mailman.ico")],
"dest_base": "fetching_service"}],
data_files=[('', ['../cacert.pem', '../trusted-certs.crt'])],
options={"py2exe": {
"includes": ["win32serviceutil", "win32service", "win32event"],
'bundle_files': 0, "optimize": 2,
'dist_dir': 'fetcher_service'}})
服务安装正确:
$ fetcher_service/fetching_service.exe --startup=delayed install
Installing service MailMan-FetchingService
Changing service configuration
Service updated
但在开始时:
$ fetcher_service/fetching_service.exe start
Starting service MailMan-FetchingService
Error starting service: Usługa nie odpowiada na sygnał uruchomienia lub sygnał sterujący w oczekiwanym czasie.
(翻译成英文:服务没有及时响应启动或控制请求) 我试过设置特定用户,但没有帮助...... 此外:运行后立即发生错误,没有延迟
忘记补充:服务在调试模式下运行完美。
您必须发出信号 Windows 您的服务实际上是 运行。在SvcDoRun
里面,调用
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
并且一旦您的服务真正启动(例如,一旦您到达 main,甚至直接在之后)
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
将您的服务标记为已成功启动。
我已经解决了这个问题。 我使用了 phihag 的答案并自己更改了 setup.py:
setup(service=[{'modules':'fetching_service','cmdline_style':'pywin32','description':'your service description',
# console=[{"script": "fetching_service.py",
"icon_resources": [(1, "../mailman.ico")],
"dest_base": "fetching_service"}],
data_files=[('', ['../cacert.pem', '../trusted-certs.crt'])],
options={"py2exe": {
"includes": ["win32serviceutil", "win32service", "win32event"],
'bundle_files': 0, "optimize": 2,
'dist_dir': 'fetcher_service'}})
此问题可能是由损坏的 pywin32 安装引起的。使用 Sys Internals excellent procmon 我发现 pythonservice.exe 无法加载 pywintypes34.dll。 运行 c:\python34\scripts\pywin32_postinstall.py 解决了这个问题。注意,如果您因为使用 pip 而将 pywin32 安装为 pypiwin32,那么您需要修复 C:\Python34\Lib\site-packages\pypiwin32_system32 dir 为 C:\Python34\Lib\site-packages\pywin32_system32 以使脚本运行。