Comment coder une horloge de surveillance pour redémarrer un service Windows?

Je suis très intéressé par la réponse à une autre question concernant les horloges de surveillance pour les services Windows (voir ici ). Cette réponse indiquait:

J’ai également utilisé un système de surveillance interne fonctionnant sur un autre thread. Ce thread examine le thread principal pour une activité comme la sortie du journal ou un événement de basculement. Si l’activité n’est pas vue, le service est considéré comme bloqué et je ferme le service.

Dans ce cas, vous pouvez configurer Windows pour redémarrer automatiquement un service arrêté et cela pourrait résoudre le problème (tant que ce n’est pas un bogue de logique interne).

Les services avec lesquels je travaille ont également des journaux de texte écrits dans un journal. En outre, pour les services sur le sharepoint «dormir un peu», je consignerai l’heure du prochain réveil. J’utilise MTAIL pour regarder un journal pour la sortie. ”

Quelqu’un pourrait-il donner un exemple de code pour utiliser un chien de garde interne fonctionnant sur un autre thread, étant donné que je dois actuellement développer un service Windows qui sera capable de redémarrer automatiquement en cas d’échec, de blocage, etc.

J’apprécie vraiment votre aide.

    Je ne suis pas un grand fan de la gestion d’un chien de garde comme fil de discussion dans le processus que vous regardez. Cela signifie que si tout le processus se bloque pour une raison quelconque, le chien de garde ne fonctionnera pas.

    Les chiens de garde sont une idée issue du monde du matériel et ils avaient raison. Utilisez un circuit externe aussi simple que possible (pour être correct). Les chiens de garde typiques exécutaient simplement une timer et, si le processus n’avait pas fait quelque chose avant l’expiration de la timer (comme l’access à un emplacement de mémoire surveillé par le chien de garde), tout était réinitialisé. Lorsque le chien de garde a été “frappé”, il redémarre le chronomètre.

    L’acte du processus donnant un coup de pied au chien de garde a protégé ce processus de la résiliation sommaire.

    Mon conseil serait d’écrire un programme autonome très simple qui surveille un événement (comme la modification de l’heure de mise à jour du fichier). Si cet événement ne s’est pas produit dans le délai imparti, arrêtez le processus surveillé (et laissez Windows le redémarrer).

    Demandez ensuite à votre programme surveillé de réécrire régulièrement ce fichier.

    Vous pouvez configurer des propriétés de service pour redémarrer automatiquement en cas de défaillance

    Services -> right-click your service -> Properties -> First failure : restart the service -> Second failure : restart the service -> Subsequent failure : restart 

    D’autres approches que vous voudrez peut-être envisager en plus de modifier régulièrement la dernière heure d’un fichier consistent à créer un compteur de performances approprié ou même un object WMI. Nous faisons le plus tard dans notre infrastructure de construction, le «truc» est de trouver une unité de travail significative dans le service surveillé et d’impulser votre «battement de cœur» chaque fois qu’une unité est terminée.

    L’avantage des compteurs WMI ou Perf par rapport à l’approche par fichier réside dans le fait que vous êtes alors visible par tout un tas d’outils de gestion / MIS professionnels. Cela peut append beaucoup de valeur.