web-dev-qa-db-ja.com

Windowsサービスリカバリがサービスを再起動しない

Windowsサービスの回復を構成して、障害が発生してから1分遅れて再起動します。しかし、実際にサービスを再起動することはできませんでした(最も明白なエラーがあっても)。

EventViewerに次のメッセージが表示されます。

ソース(MyApp.exe)のイベントID(1)の説明が見つかりません。ローカルコンピュータには、リモートコンピュータからのメッセージを表示するために必要なレジストリ情報またはメッセージDLLファイルがない可能性があります。/AUXSOURCE=フラグを使用してこの説明を取得できる場合があります。ヘルプとを参照してください。詳細のサポート。次の情報はイベントの一部です:モジュール 'MyApp.exe'のアドレス00429874でのアクセス違反。アドレス00456704の書き込み。

他にやらなければならないことはありますか?これを有効にするために設定する必要があるコード(Delphiを使用)に何かありますか?

21
M Schenkel

Service Recoveryは、サービスがクラッシュした場合の処理​​を目的としています。したがって、taskmgrに移動し、サービスプロセスの[プロセスの終了]を右クリックすると、回復ロジックが開始されます。サービス回復ロジックが開始されるとは思いません。サービスが正常に終了した場合(エラーで終了した場合でも)。

また、eventvwrメッセージは、アプリケーションがイベントID1を指定してReportEventAPIを呼び出したことを示しています。ただし、イベントビューアーにイベントメッセージを登録していないため、イベントID1を意味のあるテキスト文字列に変換できません。

Service Recoveryは、(exit(-1))呼び出しのような予期しない終了に対してのみ機能します。通常の方法でサービスを停止するために使用するすべての方法では、回復には機能しません。サービスを停止してもリカバリを機能させたい場合は、exit(-1)を呼び出すと、「サービスが予期しないエラーで停止しました」というエラーメッセージが表示され、サービスがリカバリ設定として再起動します。です。

11

SCMによって再起動するように設定されている場合、サービスコントロールマネージャーはサービスの再起動を試みます。これについては、SERVICE_FAILURE_ACTIONS構造のドキュメントで詳しく説明されています ここ

サービスは、SERVICE_STOPPEDのステータスをサービスコントローラーに報告せずに終了すると、失敗したと見なされます。

これは、SERVICE_FAILURE_ACTIONS_FLAG構造体のfFailureActionsOnNonCrashFailuresフラグを設定することで微調整できます。 ここ を参照してください。この設定は、[リカバリ]タブの[エラーのある停止のアクションを有効にする]チェックボックスをオンにすることで、サービスアプレットから設定できます。

このメンバーがTRUEで、サービスが失敗アクションを構成している場合、サービスプロセスがSERVICE_STOPPEDのステータスを報告せずに終了した場合、またはSERVICE_STOPPED状態に入ったが、SERVICE_STATUS構造体のdwWin32ExitCodeメンバーがERROR_SUCCESS(0)でない場合、失敗アクションはキューに入れられます。 。このメンバーがFALSEであり、サービスが失敗アクションを構成している場合、失敗アクションは、SERVICE_STOPPEDのステータスを報告せずにサービスが終了した場合にのみキューに入れられます。

したがって、サービスの構造、失敗アクションの構成、および「致命的なエラー」が発生した場合の動作によっては、ExitProcess()またはexit()を呼び出して十分な場合があります。ゼロ以外の値を返します。ただし、SCMを処理するコードがサービスがSERVICE_STOPPED状態に達したことをSCMに通知せずに、サービスが終了することを確認するのがおそらく最も安全です。これにより、障害アクションが常に発生することが保証されます...

3
Len Holgate

タスクマネージャからサービスを「強制終了」した場合-リカバリロジックを忘れました。バックグラウンドタスクマネージャーでは、「サービスの停止」によって「キル」プロセスが実行されます。そして、yuoが推測できるように、これはサービスの失敗ではありません。これは私がVisualStudioでそれを本当に殺すことを余儀なくされました。タスクマネージャで、サービスプロセスを右クリックします。デバッグを選択します。 Visual Studioで、[デバッグ]-> [すべて終了]を選択します。そして今、あなたはサービスの失敗をシミュレートしました。この場合、リカバリロジックは正常に機能します。

0
Kostadin