2009-12-31 8 views
35

Tengo un servicio de Windows personalizado que ejecuto en varias VM de Hyper-V. Las máquinas virtuales se reinician un par de veces por hora como parte de algunas pruebas automáticas que se están ejecutando. El servicio está configurado para inicio automático y casi todo el tiempo, se inicia correctamente."Se ha alcanzado un tiempo de espera mientras se esperaba que se conectara el servicio" después de reiniciar

Sin embargo, tal vez el 5% de las veces, sin ningún patrón que yo pueda discernir, el servicio no se inicia. Cuando se produce un error, me sale un error en el Visor de sucesos diciendo

se alcanzó un tiempo de espera (30000 milisegundos) mientras se espera para el servicio Nombre Mi servicio para conectarse.

Cuando se produce esto, puede iniciar el servicio manualmente, o reiniciar de nuevo, y el servicio se iniciará bien.

Lo que no puedo entender es que el tiempo de espera de 30 segundos no parece estar ocurriendo en mi código. La primera línea del método OnStart() de mi clase de servicio registra "Starting ..." en su log4net log. Cuando el servicio no se inicia, ni siquiera recibo nada registrado, lo que me indica que log4net no puede iniciar sesión por el motivo que sea, o que se agota el tiempo de espera antes de que se llame a OnStart().

El servicio se ejecuta en una variedad de sistemas operativos, desde XP hasta Win7 y 2008R2, y sé que configurar el servicio para el inicio diferido puede solucionar esto para Vista y más tarde, pero parece un truco.

No he podido depurar esto de forma remota debido al hecho de que ocurre de forma tan intermitente y durante el inicio del sistema, y ​​me faltan otras formas de tratar de descubrir qué está pasando. ¿Algunas ideas?

+0

¿Su servicio depende de otros servicios o de alguno de los servicios depende de su servicio para poder comenzar? –

+0

No, es completamente independiente. –

+0

¿Qué tipo de appender está utilizando para log4net? –

Respuesta

10

Es posible que desee consultar este post, no es idéntico a su situación, pero la solución ofrece consejos útiles sobre los servicios de Windows y la funcionalidad de inicio.

+2

Gracias, esto fue lo que terminé haciendo: configurar ServicesPipeTimeout a 120 segundos en todas las máquinas virtuales en las que se ejecuta este servicio. –

+0

Siguiendo el enlace de arriba, hago varias llamadas al SetServerStatus en el código que conduzco durante OnStart. De hecho, esto informa al sistema sobre el progreso y evita activamente el tiempo de espera. –

5

Mi suposición, y eso es todo, es que el disco se está agitando mucho durante el inicio, hasta el punto en que .NET Framework no se inicia en los 30 segundos que Windows asigna para que se inicien los servicios.

Una solución puede ser kludgy para establecer el servicio se inicie de forma manual, a continuación, escribir un pequeño trozo de servicios en código no administrado (por ejemplo C++, Delphi) para iniciar el servicio.

Otro enfoque puede ser iniciar el servicio de forma remota desde otra máquina. El comando sc debería hacer el trabajo correctamente.

+0

En mi caso, la primera línea del OnStart fue para iniciar sesión con log4net pero nunca he visto este mensaje de registro (no he visto ningún mensaje de registro del servicio). La computadora era vieja y el disco no era realmente rápido. Después de cambiar ServicesPipeTimeout a 60 segundos, el servicio se estaba iniciando. (http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/several-service-control-manager-issues-event-ids/5eb047bb-e5bf-47b3-a661-299f6f9835ba) –

1

Creo que también pude haber encontrado otro factor que contribuye a este tipo de no se inicia en el error de reinicio.

Parece que si el Registro de eventos de Windows está configurado para Sobrescribir eventos> 7 días ... tamaño 512kb .. Pero se ha producido una gran actividad dentro de esta ventana, entonces el registro de eventos está lleno porque no puede sobrescribir el número de eventos generados dentro de ese marco de tiempo. Si configura el registro de eventos en un tamaño mucho más grande O para sobrescribir según sea necesario, entonces no experimentará este problema

3

Por lo que vale, descubrí que recibí este mensaje (casi inmediatamente después del inicio del servicio) porque no lo hice tener la versión 4.5 del .NET Framework instalado en la máquina de destino. Revertí la versión que estaba usando a la versión 4.0 (que ya estaba instalada en la máquina de destino) y el servicio funcionó como se esperaba.

+0

Gracias! Es lamentable que no solo te diga que falta el marco:/ – user145400

0

Mi problema con el mismo error fue que el.La instalación de red en el servidor no funcionaba correctamente.

de resolver esto:

me hizo una pequeña aplicación de consola con la lógica idéntica a la del servicio de ejecución, y me hizo un try-catch alrededor de toda la pieza de código, el vertido todo a la consola.

No estoy seguro de por qué no brotó la información, pero vimos los valiosos mensajes sobre los errores del Marco que de otro modo no hubiéramos visto.

2

Estaba viendo este error en el Visor de sucesos al intentar instalar un servicio con powershell.

El problema que tuve fue que tenía diferentes valores para "Nombre del servicio" y "Nombre de visualización del servicio" en mi script de powershell para los que había especificado en el archivo program.cs de mi aplicación de consola.

+1

¡Eres un salvavidas! – MEMark

0

Estamos teniendo el mismo problema en Windows 2016 Server.

Una solución que parece estar funcionando es cambiar el usuario bajo el cual se ejecuta el servicio de la cuenta de servicio local al administrador local (no estoy seguro de cuál es la causa).

Cuestiones relacionadas