1

假设我有一个我写的基于win32serviceutil.ServiceFramework这样的服务:

class Launcher(win32serviceutil.ServiceFramework):
  _svc_name_ = "QueueFolders"
  _svc_display_name_ = "Queue Hot Folders"

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

  def SvcStop(self):
    sys.stopservice = True

  def SvcDoRun(self):
    # A call to something Main() like here.
    QueueFolders()

在此示例中,调用QueueFolders实例化一个对象,如果已完成正确的配置,该对象应长时间运行。如果不是,它会引发异常,我会在命令提示符下得到这个:

j:\EclipseWorkspace\Queue Folders\dist>net start queuefolders
The Queue Hot Folders service is starting.
The Queue Hot Folders service could not be started.

The service did not report an error.

More help is available by typing NET HELPMSG 3534.

我想知道,我该如何报告这个错误?我知道我可以try / catch实例化,但我已经尝试过,但self.ReportServiceStatus(win32service.SERVICE_ERROR_CRITICAL)似乎仍然无法向用户报告任何有意义的内容(理想情况下,以“服务无法启动,请检查配置”的形式出现。

4

1 回答 1

1

如果 SvcDoRun 有问题,可以调用:

self.ReportServiceStatus(win32service.SERVICE_STOPPED, win32ExitCode=exit_code)

Windows 系统错误代码exit_code在哪里。也许您可以找到与错误情况足够匹配的一种。例如,如果is ,您会从 中看到以下内容:exit_codewinerror.ERROR_STACK_OVERFLOWnet start QueueFolders

队列热文件夹服务正在启动。

无法启动队列热文件夹服务。

发生系统错误。

发生系统错误 1001。

递归太深;堆栈溢出。

使用 GUI 服务管理器会显示类似的消息。

此外,您可以写入 Windows 事件日志,这是报告服务消息的典型位置。为此,请使用servicemanager 模块

例如:

def SvcDoRun(self):
    # oops something went wrong
    import servicemanager
    servicemanager.LogErrorMsg("Couldn't start - check your configuration")

然后,检查事件查看器,在 Windows 日志的应用程序部分,您会看到您的消息。

于 2014-10-08T23:45:14.333 回答