Служба окна Topshelf выдает ошибку 1053 при попытке запустить службу

Я разработал службу Windows, используя Topshelf. это работает хорошо локально. Когда я развернул тестирование и попытался запустить сервис, он выдает мне следующую ошибку:

Error 1053: The service did not respond to the start or control request in a timely fashion.

Тестовый сервер работает на Windows server 2012.

Это мой сервис запуска и остановки методов:

public void Start()
{
    _logProvider.Info("Service started.");

    StartScheduledJobs();
}

public void Stop()
{
    _scheduler.Shutdown(true);

    _logProvider.Info("Service stopped.");
}

private void StartScheduledJobs()
{
    try
    {
        _scheduler.Start();

         ScheduleDeleteJob();
    }
    catch (Exception ex)
    {
        _logProvider.Error("", ex);
    }
}

Может кто-нибудь помочь мне, что может быть причиной с решением, пожалуйста?

Спасибо

8 ответов

После безуспешной попытки любого другого решения я нашел решение, которое решило мою проблему с тем же сообщением об ошибке.

public static int Main(string[] args)
{
    Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
    //...
}

На основе https://github.com/Topshelf/Topshelf/issues/473

Здесь эта проблема была решена: https://github.com/Topshelf/Topshelf/issues/183

В двух словах: ваш метод Start() должен возвращать true при запуске службы.

Проблема в том, что вы начинаете работу службы в Start() метод.

Это прекрасно работает во время разработки, но когда вы устанавливаете службу, диспетчер управления службами вызывает Start и ждет 30 секунд, пока он не вернется - если это произойдет, то считается, что служба успешно установлена.

Поскольку вы запускаете запланированные задания, однако, в методе Start он не возвращается в течение этого времени, и вы получаете эту ошибку.

Решение состоит в том, чтобы начать работу косвенно в Start и затем вернуться - запустить выделенный поток, чтобы сделать это, или использовать таймер, есть много вариантов.

Моя ситуация была намного легче решить и так просто!

Параметры службы в Program.cs не соответствуют параметрам, используемым для установки службы в ServiceInstaller.

Итак, в основном я сопоставил это в Program.cs:

                      x.SetServiceName(serviceName);
                x.SetDisplayName(serviceDisplayName);
                x.SetDescription(serviceDescription);

К параметрам, установленным в установщике службы.

Вуаля! Исправлена ​​проблема.

Я не уверен, что полученное вами сообщение об ошибке является действительной ошибкой. Как отлаживать:

  • Проверьте с журналами, что метод запуска начинается. Примечание: убедитесь, что путь к журналу указан, поскольку служба Windows может запускаться под другой учетной записью. Если у вас есть что-то вроде ${LOCALAPPDATA} в пути приложения к файлу журнала вы будете озадачены, почему вы не ведете журналы по пути, который вы использовали во время разработки.
  • Убедитесь, что прошло более 30 секунд StartScheduledJobs() отделки.
  • Если ваш код в Start не выполняется, то что-то в static void main(args []) происходит до запуска службы окна, которая вызывает эту проблему. Эта проблема может возникнуть только при запуске MyService.exe. Я рекомендую удалить код до того, где HostFactory обертывает ваш сервис.

Примечание: TopShelf имеет плагин log4net, который вы можете установить, чтобы отслеживать, где происходит исключение ( http://docs.topshelf-project.com/en/latest/configuration/logging.html).

Когда я впервые научился использовать Topshelf, я не упоминал об ускорении запуска. Ниже, если мой метод запуска был ранее

      public void Start()
{ //instatntiate a bunch of object here, taking up too much time }

Вот как я изменил свой код, чтобы ускорить метод Start

      public void Start()
{  RunStartUpTasksAysnc();}  //put a reference of start instructions on stack then exit
private async Task RunStartUpTasksAysnc()
{  
    await Task.Run(()=>{//instatntiate a bunch of object here});
}

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

В моем случае проблема была вызвана этой строкой

      Console.Title = "Some application";

У меня была такая же ситуация... Через два дня отладки один коллега увидел, что мой путь к quartz_jobs.xml в App.config неверен.

неверный

<add key="quartz.plugin.jobInitializer.fileNames" value="quartz_jobs.xml" />

верный

<add key="quartz.plugin.xml.fileNames" value="~/quartz_jobs.xml" />

Ура!

Другие вопросы по тегам