Member 14068594 Ответов: 1

Проблема с перезапуском другой службы windows из моей службы


Как я уже сказал в теме, у меня есть служба, которая работает под управлением 64bit из-за проблем с печатью в windows 10. Так что теперь нужно реализовать, пока мой сервис запущен, чтобы перезапустить anoter service из моего сервиса. Но это не работает. Он просто вводит метод service.start() и ничего не делает...

Если я попробую это сделать из одного приложения windows form, все будет в порядке.

Что я уже пробовал:

//у меня есть метод
Task.Run(() => RegisteSomeService())
//.
//.
//.
//когда этот метод входит в исключение, я хочу попробовать перезапустить службу с помощью этого кода...
//сначала я спрашиваю, остановлена ли служба, если да, то только запуск, если нет, то перезапуск ... //но в исключении нет ничего, не знаю почему
public static void RestartService(string serviceName)
        {
            try
            {
                var timeout = TimeSpan.FromMilliseconds(60 * 1000);

                $"GetStatus([{serviceName}]) - Start".Trace();

                if (GetStatus(serviceName) != ServiceControllerStatus.Stopped)
                {
                    try
                    {
                        var service = new ServiceController(serviceName);

                        service.Stop();
                        service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

                        service.Start();
                        service.WaitForStatus(ServiceControllerStatus.Running, timeout);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
                else
                {
                    try
                    {
                        $"Service Start - Start".Trace();
                        var serviceStart = new ServiceController(serviceName);
                        serviceStart.Start();
                        serviceStart.WaitForStatus(ServiceControllerStatus.Running, timeout);
                        $"Service Start - End".Trace();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static ServiceControllerStatus GetStatus(string serviceName)
        {

            ServiceController service = null;

            try
            {
                service = ServiceController.GetServices().Where(s => s.ServiceName == serviceName).FirstOrDefault();
            }
            catch (Exception ex)
            {
                throw new Exception("Service controller status - GetStatus: " + ex.ToString());
            }

            $"GetStatus([{serviceName}]) - END {service.Status}".Trace();
            return service.Status;
        }

F-ES Sitecore

Я бы избавился от таймаутов для начала, а также подумал о том, чтобы просто использовать перезапуск, а не останавливаться и начинать. Диспетчер управления службами может только дать команду службе завершить работу, нет никакой гарантии, что она завершила работу или сколько времени это займет. Проблема может заключаться в том, что останавливаемая служба неправильно реагирует на запрос об остановке или не отвечает вовремя.

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Цитата:
у меня есть служба, которая работает под управлением 64bit из - за проблем с печатью в windows 10

Нет никаких проблем с печатью в Windows 10, которая требует, чтобы приложение или служба запускались как 64-разрядные. Проблема не в коде. Это связано с вашим пониманием того, как службы работают в Windows.

Цитата:
Так что теперь нужно реализовать хотя моя служба запущена, чтобы перезапустить обслуживание потока от службы

Какую услугу вы пытаетесь остановить/запустить и, что более важно, почему вы думаете, что вам нужно это сделать?

Кроме того, все ваши блоки try/catch бесполезны и на самом деле делают больше для удаления информации из трассировки стека, чем что-либо полезное. Вы фактически удаляете информацию, которая точно указывает, где произошло исключение!


Member 14068594

Когда мой сервис стартует, нужно зарегистрировать платежный процессор, дозатор шайб и принтер.. поэтому в некоторых случаях, когда запускается windows и запускается вся служба, я не могу связаться со службой обработки платежей. Поэтому мне нужно реализовать on catch, когда моя связь с платежом рухнет, чтобы попытаться перезапустить их сервис, и, наконец, я получил эту ошибку прямо сейчас:

Система.Исключение InvalidOperationException: не удается открыть eftmpd службы на компьютере '.'. ---&ГТ; система.ComponentModel.Win32Exception: Доступ запрещен
--- Конец внутренней трассировки стека исключений ---

ооочень что теперь....

Member 14068594

С этой точки зрения мой сервис работает не как администратор, но я вхожу в сервис как пользователь admin .. так что у вас есть какие-нибудь идеи, что теперь.. ?

Dave Kreskowiak

Итак, какую учетную запись вы хотите использовать для настройки сервиса? Это будет на вкладке вход на странице свойств вашей службы в Диспетчере служб.