Подтвердить что ты не робот

С# Время ожидания службы Windows при запуске

У меня возникли трудности с попыткой определить причину таймаута в службе Windows, которую я создал с помощью С#. Я потратил значительное количество времени на несколько сообщений и тем по проблеме, но я не уверен, что еще попробовать.

Какая проблема?

Иногда на некоторых компьютерах, которые запускают мою службу Windows, она не запускается успешно после перезагрузки машины. Я получаю общие сообщения EventLog о том, что Служба не запускается своевременно и что она истекает через 30000 миллисекунд. Машины Windows Server 2003 кажутся наиболее распространенными, но не всегда изолированы от этой ОС. Например, он отлично работает на других машинах W2K3.

Сбой при запуске может быть довольно случайным, поскольку иногда он запускается, а в других случаях он терпит неудачу, поэтому очень сложно воспроизвести проблему по требованию. Я также использую Log4Net для улова и ошибок и записываю их в RollingFileAppender. Однако, когда служба не запускается, файл журнала никогда не создается и информация журнала не сохраняется. Это похоже на то, что мой входной поток службы блокируется и не получает вызов.

Другие сведения:

  • Служба Windows написана на С# и использует .Net 2.0
  • Других сервисных зависимостей для моего сервиса нет, если установлен.
  • Служба exe представляет собой сборку Release без подписи или аутентификации подписание.
  • Метод OnStart выполняется как можно быстрее, создавая Вставьте и начните эту тему. Никакой другой инициализации не происходит в OnStart.
  • Когда служба действительно не запускается, открытие служб список и запуск его вручную работает каждый раз, и служба начинается, вероятно, менее чем за секунду.

У меня есть следующий код, добавленный в мою Program.cs, который включает главную точку входа для службы. Я подключаюсь к событию UnhandledException в CurrentDomain и использую log4net для регистрации любых необработанных ошибок Там также есть попытка/улов вокруг ServiceBase.Run в случае, если он как-то взрывается, так что я могу зарегистрировать эту ошибку.

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
        new SchedulerService() 
    };

    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    try
    {
        ServiceBase.Run(ServicesToRun);
    }
    catch (Exception ex)
    {
        Log.Fatal("Unhandled Service Exception", ex);
    }
}

private static log4net.ILog _log = null;
static log4net.ILog Log
{
    get
    {
        if (_log == null)
        {
            if (!log4net.LogManager.GetRepository().Configured)
            {
                log4net.Config.XmlConfigurator.Configure();
            }

            _log = log4net.LogManager.GetLogger(typeof(Program));
        }
        return _log;
    }
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Exception ex = e.ExceptionObject as Exception;
    if (ex == null) ex = new Exception(e.ExceptionObject.ToString());

    Log.Fatal("Unhandled Service Exception", ex);
}

Код в моей унаследованной реализации ServiceBase выглядит следующим образом:

protected override void OnStart(string[] args)
{
    Thread serviceThread = new Thread(new ThreadStart(BackgroundStart));
    serviceThread.IsBackground = true;
    serviceThread.Start();
}

private void BackgroundStart()
{
    //Initialize and start worker objects to perform monitoring...
    //<Snip>
}

В моей реализации log4net используется ConsoleAppender и RollingFileAppender, где его данные конфигурации хранятся в App.config.

На этом этапе я не уверен, что еще попробовать. Если вам нужна дополнительная информация, дайте мне знать.

Спасибо.

Update: Чтобы обновить всех, я собираюсь попробовать некоторые из таких предложений, как вход в EventLog напрямую или файл вместо Log4Net, чтобы узнать, является ли эта причина. Я также попробую установить для generatePublisherEvidence в app.config значение false. Я просто жду подходящего простоя для доступа к клиентскому серверу, чтобы проверить это.

4b9b3361

Ответ 1

Я установил аналогичную проблему, отключив генерацию данных издателя в файле конфигурации. У службы также не было подписывания подлинника, но добавление следующей строки немедленно устранило проблему на машине, где она была воспроизведена последовательно.

<runtime>
    <generatePublisherEvidence enabled="false" />
</runtime>

Также рекомендуется этот источник MSDN:
"Мы рекомендуем, чтобы сервисы использовали этот элемент для повышения производительности при запуске. Использование этого элемента также позволяет избежать задержек, которые могут вызвать тайм-аут и отмену запуска службы.

Ответ 2

Несколько вещей, чтобы попробовать:

  • Добавить сообщения журнала вверху Main(), до ServiceBase.Run() и т.д. Предполагая, что вы получаете файл журнала, как эти временные метки сравниваются с журналом событий Windows?

  • Создайте новый сервис с помощью мастера создания проекта и разверните его как есть. На проблемных машинах он надежно запускается?

  • Получить монитор процесса и посмотреть обычный запуск. Найдите неожиданные сетевые или файловые операции ввода-вывода.

  • Убедитесь, что ваш SchedulerService не выполняет никакой работы в конструкторе и не имеет статически инициализированных зависимостей.

  • Установите параметры восстановления для перезапуска при первом сбое. Это работает надежно?

Ответ 3

В общем, нереста фонового потока из OnStart - это правильная вещь.

В целях устранения неполадок вы можете попытаться предоставить вашему сервису больше времени запуска, вызвав RequestAdditionalTime метод из OnStart. Кроме того, вы можете проверить, были ли какие-либо сообщения записаны в Windows EventLog (журнал "Приложение", источником должно быть ваше имя службы).

Ответ 4

Я также подозреваю, что log4net как-то висит. Возможно, диск, на котором должен быть создан журнал, еще не готов, когда машина загружается. Вы пробовали отсрочить свое обслуживание?

enter image description here

Ответ 5

Так как log4net не предназначен для (в своих словах) надежная система ведения журнала, я подумал, что было хорошей практикой писать необработанные исключения для журнал событий (а также ваш журнал), особенно с услугами.