1

win32serviceutil.ServiceFramework次のようなものに基づいて作成した Service があるとします。

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)

exit_codeはWindowsシステム エラー コードです。おそらく、エラー状況に十分に一致するものの1つを見つけることができます. たとえば、 が の場合exit_codewinerror.ERROR_STACK_OVERFLOWから次のように表示されnet start QueueFoldersます。

Queue Hot Folders サービスを開始しています。

Queue Hot Folders サービスを開始できませんでした。

システムエラーが発生しました。

システムエラー 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 に答える