Windows не удалось запустить службу на Win Server 2008 R2 с пакетом обновления 1 (ошибка 1053)
Этот вопрос, как представляется, широко обсуждается, но у меня проблемы с поиском решения в моем конкретном случае.
Моя служба настроена для работы под учетной записью Local System
. На моей первой машине с установленной Windows 7 SP1 (64-разрядная версия) все работает так, как ожидалось. Но сразу после того, как я попытаюсь запустить службу на своей второй машине с Windows Server 2008 R2 SP1 (64-разрядная версия), даже не второй проход, и я столкнулся с этой досадной ошибкой:
Windows could not start the ProService service on Local Computer
Error 1053: The service did not respond to the start or control request in a timely fashion
System Log
показывает 2 записи:
The ProService service failed to start due to the following error:
The service did not respond to the start or control request in a timely fashion.
и
A timeout was reached (30000 milliseconds) while waiting for the ProService service to connect.
Реализация выглядит следующим образом:
Program.cs:
static void Main()
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
ServiceBase.Run(new ServiceBase[] { new ProService() });
}
static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
if (e != null && e.ExceptionObject != null)
{
Logger.Record(e.ExceptionObject);
}
}
ProService.cs:
public ProService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
RequestAdditionalTime(10000);
FireStarter.Instance.Execute();
}
catch (Exception e)
{
Logger.Record(e);
throw;
}
}
Метод OnStart
только начинает новый поток, поэтому для выполнения требуется почти полная загрузка времени. Я использовал оператор RequestAdditionalTime
на всякий случай - отклонить этот вопрос как источник моей проблемы. Кроме того, как вы можете видеть, я обрабатываю все исключения, но никакое исключение не записывается в мой журнал событий службы во время запуска (кстати, ведение журнала работает на первом компьютере win7). Как узнать, что происходит?
Ответы
Ответ 1
Я понял, что происходит в несколько шагов:
- Я написал консольное приложение - оболочку для того, что в основном сделано в
OnStart
методе из службы.
- Я выполнил консольное приложение - приложение запускалось нормально.
- Я скопировал содержимое файла конфигурации службы в консольный файл конфигурации приложения.
- Я снова выполнил консольное приложение - приложение прерывается молча и сразу (на удивление похоже на наше поведение службы, что-то не так).
-
Я сравнил 2 конфигурации - от службы и оригинал от консольного приложения. В результате я нашел некоторые отличия. Среди прочего, была такая запись - источник проблемы (после удаления все работает):
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
Итак, в основном у меня был устаревший конфигурационный файл. Раньше служба была скомпилирована в .NET 4.5, затем я изменил фреймворк на 4.0 и развернул файлы на сервер, но оставил предыдущий файл конфигурации (я изменил целевую структуру, потому что моя машина для разработки имела .NET 4.5, а сервер не). Я бы не подумал, что показанные строки скроют все проблемы без какой-либо разумной информации, что поможет отслеживать беспорядок.
Ответ 2
Проверьте отсутствие зависимостей /DLL.
Если вы еще этого не сделали, позвольте вашей службе быть вызванным как обычное приложение (отличный метод для долгосрочной отладки) и посмотрите, правильно ли он запускается на вашем компьютере под управлением Windows 2008.
Если это работает, тогда может возникнуть проблема с запуском в учетной записи LocalSystem. Перейдите к запуску приложения из командной строки, запущенной в учетной записи LocalSystem (пример настройки здесь).
Ответ 3
Я попробовал следующее исправление, которое было предоставлено в этой ссылке
-
Нажмите "Пуск", выберите "Выполнить", введите "regedit" и нажмите "ОК".
-
Найдите и выберите следующий подраздел реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
- В правой панели найдите запись ServicesPipeTimeout.
Примечание. Если запись ServicesPipeTimeout не существует, вы должны ее создать. Чтобы сделать это, выполните следующие действия:
а. В меню "Правка" выберите "Создать", а затем "Значение DWORD".
б. Введите ServicesPipeTimeout и нажмите клавишу ВВОД.
- Щелкните правой кнопкой мыши ServicesPipeTimeout и выберите команду Изменить.
- Нажмите "Десятичный", введите 60000 и нажмите "ОК".
Это значение представляет время в миллисекундах до истечения срока службы.
- Перезагрузите компьютер.
Но у меня возникла проблема с запуском службы.
Исправление, которое сработало для меня, было
- Перейдите в services.msc
- Дважды щелкните службу, которую вы пытаетесь запустить.
- Взять вкладку "Вход в систему"
- Изменен. Войдите в систему как: в локальную учетную запись системы.
- Пробовал запуск службы после этого изменения (все еще дал ошибку 1053)
- Снова запустил вкладку "Вход в систему", изменил ее на "Сетевая служба" (дал случайный новый пароль).
- Попробовал снова запустить службу. (Служба полностью запущена)
Ответ 4
Я попробовал следующие шаги. Он работал как шарм.
1.Возможность services.msc
2. Дважды щелкните службу, которую вы пытаетесь запустить.
3.Выполните вкладку "Вход в систему"
4.Changed Войдите в систему как: в учетную запись локальной системы.
5. Попробуйте начать сервис после этого изменения (все еще дал ошибку 1053)
6. Верните вкладку "Вход в систему" еще раз, изменив ее на "Сетевая служба" (дал новый пароль)
7. Попробуйте снова начать службу (услуга началась отлично).
Но я просто хочу знать, в чем проблема.
Ответ 5
После установки службы я должен предоставить полное разрешение на управление (Everyone) для папки установки. Затем моя служба начнет совершенствоваться.