web-dev-qa-db-fra.com

Erreur "Un délai d'attente a été atteint lors de l'attente de la connexion du service" après le redémarrage

J'ai un service Windows personnalisé que j'exécute sur un certain nombre de machines virtuelles Hyper-V. Les machines virtuelles sont redémarrées quelques fois par heure dans le cadre de certains tests automatisés en cours d'exécution. Le service est configuré pour démarrer automatiquement et presque tout le temps, il démarre correctement.

Cependant, peut-être 5% du temps, sans schéma que je puisse discerner, le service ne démarre pas. En cas d'échec, j'obtiens une erreur dans l'Observateur d'événements disant

Un délai d'attente a été atteint (30000 millisecondes) lors de l'attente de la connexion du service Mon nom de service.

Lorsque cela se produit, je peux démarrer le service manuellement ou redémarrer à nouveau et le service démarrera correctement.

La chose que je ne peux pas comprendre, c'est que le délai d'attente de 30 secondes ne semble pas se produire dans mon code. La toute première ligne de la méthode OnStart () de ma classe de service enregistre "Starting ..." dans son journal log4net. Lorsque le service ne démarre pas, je ne reçois même rien du tout, ce qui m'indique que soit log4net ne peut pas se connecter pour une raison quelconque, soit le délai d'attente se produit avant que mon OnStart () soit appelé.

Le service fonctionne sur une variété d'OS, de XP jusqu'à Win7 et 2008R2, et je sais que régler le service sur un démarrage différé peut résoudre ce problème pour Vista et versions ultérieures, mais cela semble comme un hack.

Je n'ai pas été en mesure de déboguer à distance en raison du fait que cela se produit de manière intermittente et au démarrage du système, et je suis à court de nouvelles façons d'essayer de comprendre ce qui se passe. Des idées?

43
Zack Elan

Ma conjecture - et c'est tout ce que c'est - est que le disque se débat durement au démarrage, au point où le .NET Framework lui-même ne démarre pas dans les 30 secondes que Windows alloue pour que les services démarrent.

Une solution de contournement kludgy peut être de définir le service pour démarrer manuellement, puis d'écrire un très petit service de raccord en code non managé (par exemple C++, Delphi) pour démarrer le service.

Une autre approche peut être de démarrer le service à distance à partir d'une autre machine. La commande sc devrait bien faire le travail.

6
Jeremy McGee

Pour ce que ça vaut, j'ai découvert que j'avais reçu ce message (presque immédiatement au démarrage du service) car je n'avais pas la version 4.5 du framework .NET installée sur la machine cible. J'ai annulé la version que j'utilisais vers la version 4.0 (qui était déjà installée sur la machine cible) et le service a fonctionné comme prévu.

3
Jason Richmeier

Je voyais cette erreur dans l'Observateur d'événements lorsque j'essayais d'installer un service avec PowerShell.

Le problème que j'avais était que j'avais des valeurs différentes pour "Nom du service" et "Nom d'affichage du service" dans mon script powershell à celles que j'avais spécifiées dans le fichier program.cs de mon application console.

2
JDTLH9

Je pense que j'ai peut-être également trouvé un autre facteur contribuant à ce type de ne pas démarrer en cas d'erreur de redémarrage.

Il semble que si le journal des événements Windows est défini sur Écraser les événements> 7 jours .. taille 512 Ko. Mais une grande activité s'est produite dans cette fenêtre, le journal des événements est effectivement plein car il ne peut pas écraser le nombre d'événements générés à l'intérieur. ce délai. Si vous définissez le journal des événements sur une taille beaucoup plus grande OR pour remplacer au besoin, vous ne rencontrerez pas ce problème

1
Paul Farry

Nous rencontrons le même problème sur Windows 2016 Server.

Un correctif qui semble fonctionner modifie l'utilisateur sous lequel le service s'exécutant du compte de service local à l'administrateur local (pas sûr de la cause).

0
Kosmo

Mon problème avec la même erreur était que l'installation .Net sur le serveur ne fonctionnait pas correctement.

Pour comprendre cela:

J'ai créé une petite application de console avec une logique identique à celle du service d'exécution, et j'ai fait un essai sur tout le morceau de code, en le déversant sur la console.

Je ne sais pas pourquoi l'information n'a pas bouillonné, mais nous avons vu les précieux messages sur les erreurs de Framework que nous n'aurions jamais vus autrement.

0
Robert Achmann