open - Servicio de recuperación de servicios de Windows no reinicio
windows service manager windows 7 (4)
Configuré la recuperación para que los servicios de Windows se reinicien con un retraso de un minuto después de las fallas. Pero nunca lo conseguí para reiniciar el servicio (incluso con los errores más evidentes).
Recibo un mensaje en el EventViewer:
No se puede encontrar la descripción del Id. De evento (1) en Origen (MyApp.exe). Es posible que la computadora local no tenga la información de registro o los archivos DLL de mensajes necesarios para mostrar los mensajes desde una computadora remota. Es posible que pueda usar el indicador / AUXSOURCE = para recuperar esta descripción; Consulte Ayuda y soporte técnico para obtener más información. La siguiente información es parte del evento: Infracción de acceso en la dirección 00429874 en el módulo ''MyApp.exe''. Escrito de la dirección 00456704.
¿Hay algo más que tenga que hacer? ¿Hay algo en mi código (yo uso Delphi) que deba configurarse para habilitar esto?
La recuperación del servicio está diseñada para manejar el caso en el que un servicio falla, por lo tanto, si va a taskmgr y hace clic con el botón derecho en "finalizar el proceso" en su proceso de servicio, la lógica de recuperación debería comenzar. No creo que la lógica de recuperación del servicio se active si su servicio sale con gracia (incluso si sale con un error).
Además, el mensaje eventvwr indica que su aplicación llamó a la API ReportEvent que especifica el ID de evento 1. Pero no ha registrado sus mensajes de eventos con el visor de eventos por lo que no puede convertir el ID de evento 1 en una cadena de texto significativa.
La recuperación del servicio solo funciona para una salida inesperada como la llamada ( exit (-1) ). Por todo el camino que usamos para detener el servicio de manera habitual no funcionará para la recuperación. Si desea detener el servicio y aún desea que la recuperación funcione, llame a exit (-1) y verá el mensaje de error como "servicio detenido con error inesperado", y luego su servicio se reiniciará como está la configuración de recuperación.
Si ''mata'' el servicio desde el administrador de tareas, olvide la lógica de recuperación. En segundo plano, el administrador de tareas ''mata'' el proceso por ''detener el servicio''. y como pueden adivinar, esto no es un fallo del servicio. Esto me obligó a matarlo realmente con Visual Studio. En el administrador de tareas, haga clic derecho en el proceso de servicio. Seleccione depurar. En Visual Studio, seleccione Depurar-> Terminar todo. Y ahora tienes el servicio simulado de fallar. En este caso, la lógica de recuperación funciona bien.
El Administrador de control de servicios intentará reiniciar su servicio si lo configuró para que lo reinicie el SCM. Esto se detalla here en la documentación de la estructura SERVICE_FAILURE_ACTIONS
.
Un servicio se considera fallido cuando finaliza sin informar un estado de SERVICE_STOPPED al controlador de servicio.
Esto se puede ajustar con fFailureActionsOnNonCrashFailures
al fFailureActionsOnNonCrashFailures
bandera fFailureActionsOnNonCrashFailures
la estructura SERVICE_FAILURE_ACTIONS_FLAG
, consulte here ). Puede establecer esta configuración desde el applet de Servicios marcando la casilla de verificación "Habilitar acciones para paradas con errores" en la pestaña de recuperación.
Si este miembro es VERDADERO y el servicio ha configurado acciones de falla, las acciones de falla se ponen en cola si el proceso de servicio finaliza sin informar un estado de SERVICE_STOPPED o si ingresa al estado SERVICE_STOPPED pero el miembro dwWin32ExitCode de la estructura SERVICE_STATUS no es ERROR_SUCCESS (0) . Si este miembro es FALSO y el servicio ha configurado acciones de falla, las acciones de falla se ponen en cola solo si el servicio termina sin informar un estado de SERVICE_STOPPED.
Entonces, dependiendo de cómo haya estructurado su servicio, cómo haya configurado sus acciones de falla Y qué hará cuando tenga su ''error fatal'' puede ser suficiente llamar a ExitProcess()
o exit()
y devolver un valor distinto de cero. Sin embargo, es probable que sea más seguro asegurarse de que su servicio salga sin el código que está tratando con el SCM y le dice al SCM que su servicio ha alcanzado el estado SERVICE_STOPPED
. Esto asegura que sus acciones de falla SIEMPRE ocurran ...