Topshelf: команда установки не возвращается после успешной установки службы

ПРИМЕЧАНИЕ. Я не делаю ничего похожего на установщик Topshelf требует, чтобы я дважды нажимал клавишу ВВОД - почему?

Класс обслуживания (интересные детали):

public class ServiceCore
{
    public ServiceCore(ServiceRuntimeConfiguration serviceRuntimeConfiguration)
    {
        _runningTasks = new List<Task>();
    }

        public bool Start(HostControl hostControl)
        {
            _hostControl = hostControl;
            _messageProcessor.Start(); // Starts a System.Threading.Tasks.Task
            StartListener(); // starts a System.Threading.Tasks.Task
            return true;
        }
}

Program.cs:

Host host = HostFactory.New(configurator =>
{

configurator.UseNLog();

// Configure core service
configurator.Service<ServiceCore>(svc =>
{
    svc.ConstructUsing(theService => new ServiceCore(_serviceRuntimeConfiguration));
    svc.WhenStarted((svc, hostControl) => svc.Start(hostControl));
    svc.WhenStopped((svc, hostControl) => svc.Stop(hostControl));
});

// Configure recovery params
configurator.EnableServiceRecovery(recoveryConfigurator =>
{
    recoveryConfigurator.RestartService(0);
    recoveryConfigurator.OnCrashOnly();
    recoveryConfigurator.SetResetPeriod(1);
});

// Execute HostConfigurator
host.Run();
}

Проблема

Когда я это сделаю:

MyService.exe install --manual --localsystem

Служба устанавливается нормально, но команда никогда не возвращает:

Запуск транзакционной установки.

Начало этапа установки. Установка службы NotificationEngine.Main ... Служба NotificationEngine.Main успешно установлена.

Фаза установки завершена успешно, и начинается фаза фиксации.

Фаза фиксации завершена успешно.

Транзакционная установка завершена.

^ C (мне нужно нажать CTRL + C)

Что мне нужно сделать, чтобы команда установки завершилась и вернулась?

ПРИМЕЧАНИЕ. Такое же поведение наблюдается, если я запускаю справку (т.е. справка отображается, но команда не возвращается):

MyService.exe help

person Sudhanshu Mishra    schedule 22.01.2016    source источник


Ответы (2)


Обычно это означает, что вы не освобождаете контроль над каким-либо ресурсом, и процесс не может полностью завершиться. Однако это сложная штука, поэтому сказать наверняка сложно.

Я бы попробовал несколько вещей

  • Что произойдет, если вы выполните MyService start после установки / CTRL + C? Я предполагаю, что он также блокирует, так как справка делает.
  • Проверьте ведение журнала, у вас какие-то включены? Есть ли конфликты файлов или проблемы с разрешениями?
  • Что еще делает ваша Main() точка входа? Он что-то делает после host.Run()? В приведенном выше коде создается впечатление, что вы вызываете его изнутри конструкции этого объекта, но я предполагаю, что это плохая вырезка и вставка.
  • Убедитесь, что вы не инициализируете ресурсы до того, как будут запущены обратные вызовы ConstructUsing и When*.

После этого я бы отправил это в наш список рассылки по адресу https://groups.google.com/forum/#!forum/topshelf-discuss.

person Travis    schedule 23.01.2016
comment
Спасибо за подробный ответ. Я проверю и отправлю обратно. - person Sudhanshu Mishra; 24.01.2016

ServiceCore: ServiceBase

Тип T, указанный в конфигураторе. Служба должен быть подклассом ServiceBase.

Это устранило проблему для службы, которая могла нормально устанавливаться, но зависала на последнем этапе установки / удаления.

person gator.johnson    schedule 06.11.2018