Напишите мне, если остановится служба Windows - PullRequest
3 голосов
/ 21 декабря 2011

Я хочу иметь возможность проверить, работает ли определенная служба (скажем, у нее отображаемое имя - ServiceA).Я хочу, чтобы моя программа проверяла каждые 5 минут, что служба все еще работает.Если все в порядке, он будет зацикливаться и ждать еще 5 минут, а затем проверить снова.Если он обнаружит, что ServiceA остановлен, я хочу, чтобы программа отправила мне электронное письмо и сказала ... ServiceA прекратил работу.Ниже у меня есть код, который я сделал до сих пор, который может вытащить все текущие запущенные сервисы и там фактическое отображаемое имя обратно в консоль.У кого-нибудь есть идеи по коду / логике, необходимые для того, что мне нужно выше?

namespace ServicesChecker
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceController[] scServices;
            scServices = ServiceController.GetServices();

            Console.WriteLine("Services running on the local computer:");
            foreach (ServiceController scTemp in scServices)
            {
                if (scTemp.Status == ServiceControllerStatus.Running)
                {
                    Console.WriteLine();
                    Console.WriteLine("  Service :        {0}", scTemp.ServiceName);
                    Console.WriteLine("    Display name:    {0}", scTemp.DisplayName); 
                }
            }
            //Create a Pause....
            Console.ReadLine();
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 21 декабря 2011

Поместите имя каждой службы в массив и проверьте, работает ли желаемое имя

List<string> arr = new List<string>();    
foreach (ServiceController scTemp in scServices)
{
    if (scTemp.Status == ServiceControllerStatus.Running)
    {
        arr.add(scTemp.ServiceName);
    }
}
if (arr.Contains("YourWantedName")
{
    // loop again
}
else
{
    // send mail
}
2 голосов
/ 21 декабря 2011

Нет необходимости перебирать все сервисы, если вы знаете, какой из них вы ищете: вы можете создать экземпляр ServiceController с именем сервиса .

Что касается отправкиэлектронная почта: взгляните на класс System.Net.Mail.MailMessage .

Примечание: вы знаете, что вы также можете просто настроить службу для запуска действия в случае сбоя?

0 голосов
/ 21 декабря 2011

Вот пример службы, которая делает нечто похожее. Должно быть просто адаптировать его к вашим потребностям ..

    public partial class CrowdCodeService : ServiceBase
    {
        private Timer stateTimer;
        private TimerCallback timerDelegate;
        AutoResetEvent autoEvent = new AutoResetEvent(false);

        public CrowdCodeService()
        {
            InitializeComponent();
        }
        int secondsDefault = 30;
        int secondsIncrementError = 30;
        int secondesMaximum = 600;
        int seconds;
        protected override void OnStart(string[] args)
        {
            Loggy.Add("Starting CrowdCodeService.");
            timerDelegate = new TimerCallback(DoSomething);
            seconds = secondsDefault;
            stateTimer = new Timer(timerDelegate, autoEvent, 0, seconds * 1000);
        }

        static bool isRunning = false;

        // The state object is necessary for a TimerCallback.
        public void DoSomething(object stateObject)
        {
            if (CrowdCodeService.isRunning)
            {
                return;
            }
            CrowdCodeService.isRunning = true;
            AutoResetEvent autoEvent = (AutoResetEvent)stateObject;
            try
            {

                ////// Do your work here


                string cs = "Application";
                EventLog elog = new EventLog();
                if (!EventLog.SourceExists(cs))
                    {
                        EventLog.CreateEventSource(cs, cs);
                    }
                    elog.Source = cs;
                    elog.EnableRaisingEvents = true;

                    elog.WriteEntry("CrowdCodes Service Error:" + cmd.Message.ToString(), EventLogEntryType.Error, 991);
                }
            }
            finally
            {    
                CrowdCodeService.isRunning = false;
            }

        }


        protected override void OnStop()
        {
            Loggy.Add("Stopped CrowdCodeService.");
            stateTimer.Dispose();
        }
    }
0 голосов
/ 21 декабря 2011

Вам нужно будет отслеживать состояние службы, для которой потребуется какое-то хранилище. Самым простым, вероятно, является XML-файл, который отслеживает состояние службы, может быть схема, подобная этой

<services>
 <service name="service1" last-check="12/21/2011 13:00:05" last-status="running" />
 ...
</services>

Ваше приложение для мониторинга проснется, обнаружит статус интересующих его сервисов и проверит, какой статус был у этого сервиса в прошлом. Если статус был запущен, но в данный момент остановлен, отправьте электронное письмо. Если сервис не найден, добавьте его в список сервисов.

Сохранение статуса сервисов на диске защищает вас в случае, когда ваше приложение мониторинга отключается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...