Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 13.01.06 09:55
Оценка:
День добрый.

Столкнулись с такой проблемой.
Сервис, написанный на .net 1.1, установлен где-то примерно у 500 клиентов. Если сервис запускаеться вручную, то никаких проблем не возникает. Но при старте в автоматическом режиме при загрузке системы, вылетает ошибка от SCM, что программа не ответила в течении 30 секунд. При этом у некоторых клиентов это идет постоянно, а у некоторых через раз(два). При этом в сервисе используеться логирование через log4net и сразу при запуске log4net создает файл логирования. Так вот если сервис не запустился при старте системы, то файла логирования нету, т.е. получаеться, что наш код как таковой не запускаеться на выполнение.
Re: Автостарт сервиса написанного на .net
От: Ведмедь Россия  
Дата: 13.01.06 10:30
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>День добрый.


Д>Столкнулись с такой проблемой.

Д>Сервис, написанный на .net 1.1, установлен где-то примерно у 500 клиентов. Если сервис запускаеться вручную, то никаких проблем не возникает. Но при старте в автоматическом режиме при загрузке системы, вылетает ошибка от SCM, что программа не ответила в течении 30 секунд. При этом у некоторых клиентов это идет постоянно, а у некоторых через раз(два). При этом в сервисе используеться логирование через log4net и сразу при запуске log4net создает файл логирования. Так вот если сервис не запустился при старте системы, то файла логирования нету, т.е. получаеться, что наш код как таковой не запускаеться на выполнение.

А что именно делает сервис? Подозраения могут быть следующие:
1. Зависимость от других сервисов( MSMQ, например), которые не прописаны в сервисах. Когда в ручную стартуешь, все уже застартовано.
2. Взаимодействие с десктопом — пока нет залогиненного оператора он не может стартовать.
3. Очень интересно бывает просмотреть системный лог( Application и, что важнее в данном случае, System). Когда исключение не обработано, .NET показывает стандартный диалог. Так как приложение- сервис, то, возможно, этот диалог просто не виден, но его появление должно отражаться в системных логах.
Да пребудет с тобой Великий Джа
Re: Автостарт сервиса написанного на .net
От: Rn Россия  
Дата: 13.01.06 11:56
Оценка:
Можно так попробовать:
1. Получаеш Start запускаеш поток в котором очновное действо происходит и уходиш.
2. Добавь в логер сохранение ошибок в журнал сообщений.
3. Смотриш журнал у тех пользователей у которых служба твоя рухнула и сравниваеш.

30 секунд на то и дается чтобы поток запустить и вернуть управление.
DOCTRINA MULTIPLEX, VERITAS UNA.
Re[2]: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 13.01.06 12:02
Оценка:
Здравствуйте, Ведмедь, Вы писали:

В>А что именно делает сервис? Подозраения могут быть следующие:

В>1. Зависимость от других сервисов( MSMQ, например), которые не прописаны в сервисах. Когда в ручную стартуешь, все уже застартовано.
В>2. Взаимодействие с десктопом — пока нет залогиненного оператора он не может стартовать.
В>3. Очень интересно бывает просмотреть системный лог( Application и, что важнее в данном случае, System). Когда исключение не обработано, .NET показывает стандартный диалог. Так как приложение- сервис, то, возможно, этот диалог просто не виден, но его появление должно отражаться в системных логах.

Сервис занимаеться обработкой информации поступающей в БД.
1. Единственная зависимость от SQL, он стоит в зависимости. Да и работа с ним осуществляеться в отдельном потоке.
2. Взаимодействие с десктопом отключено.
3. В логе Applications пишеться, что сервис не может установить связь с контролером служб, я так понимаю что с SCM. А в Systems пишутся сообщения от SCM, что служба не отвечает.
Re[2]: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 13.01.06 12:04
Оценка:
Здравствуйте, Rn, Вы писали:

Rn>Можно так попробовать:

Rn>1. Получаеш Start запускаеш поток в котором очновное действо происходит и уходиш.
Rn>2. Добавь в логер сохранение ошибок в журнал сообщений.
Rn>3. Смотриш журнал у тех пользователей у которых служба твоя рухнула и сравниваеш.

Rn>30 секунд на то и дается чтобы поток запустить и вернуть управление.


1. Именно так и делаеться.
2. До логера действия не доходят т.к. файл лога не создаеться, да и стоит там логирование в журнал событий.
Re[3]: Автостарт сервиса написанного на .net
От: Ведмедь Россия  
Дата: 13.01.06 12:13
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>Здравствуйте, Ведмедь, Вы писали:



Д>Сервис занимаеться обработкой информации поступающей в БД.

Д>1. Единственная зависимость от SQL, он стоит в зависимости. Да и работа с ним осуществляеться в отдельном потоке.
Д>2. Взаимодействие с десктопом отключено.
Д>3. В логе Applications пишеться, что сервис не может установить связь с контролером служб, я так понимаю что с SCM. А в Systems пишутся сообщения от SCM, что служба не отвечает.

А с каким SQL он соотносится? И можешь первой команде в Main написать логирование в EventLog.
Да пребудет с тобой Великий Джа
Re[4]: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 13.01.06 12:19
Оценка:
Здравствуйте, Ведмедь, Вы писали:

В>А с каким SQL он соотносится? И можешь первой команде в Main написать логирование в EventLog.


С MSDE 2k.
Re: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 16.01.06 07:25
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>День добрый.


Д>Столкнулись с такой проблемой.

Д>Сервис, написанный на .net 1.1, установлен где-то примерно у 500 клиентов. Если сервис запускаеться вручную, то никаких проблем не возникает. Но при старте в автоматическом режиме при загрузке системы, вылетает ошибка от SCM, что программа не ответила в течении 30 секунд. При этом у некоторых клиентов это идет постоянно, а у некоторых через раз(два). При этом в сервисе используеться логирование через log4net и сразу при запуске log4net создает файл логирования. Так вот если сервис не запустился при старте системы, то файла логирования нету, т.е. получаеться, что наш код как таковой не запускаеться на выполнение.

Из журнала системы:
source: Service Control Manager
    Timeout (30000 milliseconds) waiting for the TempService service to connect.

    For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

    The TempService service failed to start due to the following error:
    The service did not respond to the start or control request in a timely fashion.

    For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

Из журнала приложений:
source: TempService
    Невозможно запустить службу. Процесс службы не может установить связь с контроллером службы

    For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Re: Автостарт сервиса написанного на .net
От: Red Bird Россия  
Дата: 16.01.06 07:50
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>День добрый.


Д>Столкнулись с такой проблемой.

Д>Сервис, написанный на .net 1.1, установлен где-то примерно у 500 клиентов. Если сервис запускаеться вручную, то никаких проблем не возникает. Но при старте в автоматическом режиме при загрузке системы, вылетает ошибка от SCM, что программа не ответила в течении 30 секунд. При этом у некоторых клиентов это идет постоянно, а у некоторых через раз...
[skip]

1. Добавь в конструктор службы следующий текст:
/// <summary>
/// Конструктор
/// </summary>
public srvName()
{
    // This call is required by the Windows.Forms Component Designer.
    InitializeComponent();
    // TODO: Add any initialization after the InitComponent call
    try
    {
        ...            
    }
    catch(Exception e) 
    {
        Trace.WriteLine("Конструктор:"+e.Message);
    }
}


2. Аналогичные действия сделай и для методов:
static void Main()
private void InitializeComponent()
protected override void Dispose( bool disposing )
protected override void OnStart(string[] args)
protected override void OnStop()


3. Добавь в каталог службы файл .config
и включи в него секцию <system.diagnostics>:

<configuration>
   <system.diagnostics>
      <trace autoflush="true" indentsize="0">
         <listeners>
            <add name="MyListener"
                 type="System.Diagnostics.TextWriterTraceListener, Version, Culture, PublicKeyToken" 
                 initializeData="MyListener.log"/>
         </listeners>
      </trace>
   </system.diagnostics>
</configuration>


После падения анализируй файл .log, чтобы понять что произошло.
Можешь "натыкать" в коде как можно больше вызовов Trace.WriteLine(""),
чтобы понять как работает твоя служба (без отладчика).
Re: Автостарт сервиса написанного на .net
От: Engineer  
Дата: 19.01.06 13:19
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>День добрый.


Д>Столкнулись с такой проблемой.

Д>Сервис, написанный на .net 1.1, установлен где-то примерно у 500 клиентов. Если сервис запускаеться вручную, то никаких проблем не возникает. Но при старте в автоматическом режиме при загрузке системы, вылетает ошибка от SCM, что программа не ответила в течении 30 секунд. При этом у некоторых клиентов это идет постоянно, а у некоторых через раз(два). При этом в сервисе используеться логирование через log4net и сразу при запуске log4net создает файл логирования. Так вот если сервис не запустился при старте системы, то файла логирования нету, т.е. получаеться, что наш код как таковой не запускаеться на выполнение.

.NET-службы в автостарте работают плохо. Им часто не хватает 30 секунд, выделяемых SCM на инициализацию, для загрузки CLR, JIT-компиляции и тому подобного. Напиши простой unmanaged-сервис на С++ (типа Guardian), который будет делать только и того, что запускаться в режиме Auto и периодически (раз в 5-10 секунд) проверять состояние основного .NET-сервиса и запускать его, если он не запущен. Сервис .NET установи в режим загрузки Manual. Так можно безболезненно запускать целую группу .NET-сервисов.
Re[2]: Автостарт сервиса написанного на .net
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.01.06 13:35
Оценка:
Здравствуйте, Engineer, Вы писали:

E>.NET-службы в автостарте работают плохо. Им часто не хватает 30 секунд, выделяемых SCM на инициализацию, для загрузки CLR, JIT-компиляции и тому подобного. Напиши простой unmanaged-сервис на С++ (типа Guardian), который будет делать только и того, что запускаться в режиме Auto и периодически (раз в 5-10 секунд) проверять состояние основного .NET-сервиса и запускать его, если он не запущен. Сервис .NET установи в режим загрузки Manual. Так можно безболезненно запускать целую группу .NET-сервисов.


А зачем тогда .NET делать отдельным сервисом? Поднимать тогда уж сразу CLR самостоятельно и не пользоваться штатной нетовской заглушкой.
... << RSDN@Home 1.2.0 alpha rev. 631>>
AVK Blog
Re[3]: Автостарт сервиса написанного на .net
От: Engineer  
Дата: 19.01.06 13:55
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Engineer, Вы писали:


E>>.NET-службы в автостарте работают плохо. Им часто не хватает 30 секунд, выделяемых SCM на инициализацию, для загрузки CLR, JIT-компиляции и тому подобного. Напиши простой unmanaged-сервис на С++ (типа Guardian), который будет делать только и того, что запускаться в режиме Auto и периодически (раз в 5-10 секунд) проверять состояние основного .NET-сервиса и запускать его, если он не запущен. Сервис .NET установи в режим загрузки Manual. Так можно безболезненно запускать целую группу .NET-сервисов.


AVK>А зачем тогда .NET делать отдельным сервисом? Поднимать тогда уж сразу CLR самостоятельно и не пользоваться штатной нетовской заглушкой.


Из условий задачи видно, что .NET-сервис у человека уже готов и работает. Единственная проблема — через раз запускается в режиме Auto. Чтобы решить её минимальной кровью, ничего работающего не трогая, вполне достаточно приставить к медленному .NET-сервису кого-то поменьше и пошустрей. 15 строк кода этого "поменьше и пошустрей" будут явно проще, чем ручная реализация загрузчика ОС .
Re[4]: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 19.01.06 14:19
Оценка:
Здравствуйте, Engineer, Вы писали:

E>Здравствуйте, AndrewVK, Вы писали:


AVK>>Здравствуйте, Engineer, Вы писали:


E>>>.NET-службы в автостарте работают плохо. Им часто не хватает 30 секунд, выделяемых SCM на инициализацию, для загрузки CLR, JIT-компиляции и тому подобного. Напиши простой unmanaged-сервис на С++ (типа Guardian), который будет делать только и того, что запускаться в режиме Auto и периодически (раз в 5-10 секунд) проверять состояние основного .NET-сервиса и запускать его, если он не запущен. Сервис .NET установи в режим загрузки Manual. Так можно безболезненно запускать целую группу .NET-сервисов.


AVK>>А зачем тогда .NET делать отдельным сервисом? Поднимать тогда уж сразу CLR самостоятельно и не пользоваться штатной нетовской заглушкой.


E>Из условий задачи видно, что .NET-сервис у человека уже готов и работает. Единственная проблема — через раз запускается в режиме Auto. Чтобы решить её минимальной кровью, ничего работающего не трогая, вполне достаточно приставить к медленному .NET-сервису кого-то поменьше и пошустрей. 15 строк кода этого "поменьше и пошустрей" будут явно проще, чем ручная реализация загрузчика ОС .


Замечена ещё одна особенность. Не стартует в случае некорректного выключения питания. В случае же, если сервис успешно останавливает свою работу, то после он успешно стартует.
Re[4]: Автостарт сервиса написанного на .net
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.01.06 14:39
Оценка:
Здравствуйте, Engineer, Вы писали:

E>15 строк кода этого "поменьше и пошустрей" будут явно проще, чем ручная реализация загрузчика ОС .


CLR ты хотел сказать? Там не сильно больше. Позвать CorBindToRuntime, запросить текущий домен и вызвать у него ExecuteAssembly. Всего строк 20 наверное.
... << RSDN@Home 1.2.0 alpha rev. 631>>
AVK Blog
Re[2]: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 23.01.06 13:51
Оценка:
Здравствуйте, Engineer, Вы писали:

E>Здравствуйте, Дмитрич, Вы писали:


Д>>День добрый.


Д>>Столкнулись с такой проблемой.

Д>>Сервис, написанный на .net 1.1, установлен где-то примерно у 500 клиентов. Если сервис запускаеться вручную, то никаких проблем не возникает. Но при старте в автоматическом режиме при загрузке системы, вылетает ошибка от SCM, что программа не ответила в течении 30 секунд. При этом у некоторых клиентов это идет постоянно, а у некоторых через раз(два). При этом в сервисе используеться логирование через log4net и сразу при запуске log4net создает файл логирования. Так вот если сервис не запустился при старте системы, то файла логирования нету, т.е. получаеться, что наш код как таковой не запускаеться на выполнение.

E>.NET-службы в автостарте работают плохо. Им часто не хватает 30 секунд, выделяемых SCM на инициализацию, для загрузки CLR, JIT-компиляции и тому подобного. Напиши простой unmanaged-сервис на С++ (типа Guardian), который будет делать только и того, что запускаться в режиме Auto и периодически (раз в 5-10 секунд) проверять состояние основного .NET-сервиса и запускать его, если он не запущен. Сервис .NET установи в режим загрузки Manual. Так можно безболезненно запускать целую группу .NET-сервисов.


А кроме как приделывать костыль, можно настроить запуск сервиса ???

Пробовали сформировать имиджи в нативном коде через ngen. Но это не помогло...
Re[5]: Автостарт сервиса написанного на .net
От: Red Bird Россия  
Дата: 23.01.06 15:46
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>Здравствуйте, Engineer, Вы писали:


[skip]

Д>Замечена ещё одна особенность. Не стартует в случае некорректного выключения питания. В случае же, если сервис успешно останавливает свою работу, то после он успешно стартует.


Все же думаю, что проблема в алгоритме...

Для того чтобы исключить "кривизну ОС" попробуйте написать "пустой" сервис, который ничего не делает.
Установите его "рядышком" с основным сервисом и пробуйте смоделировать ситуацию.

Если окажется, что "пустой" сервис тоже не запускается, то дело, скорее всего в ОС, реестре и т.п. на конкретной машине.

У меня была похожая ситуация, когда сервис работал на всех машинах кроме одной (на которой он и должен был эксплуатироваться) в результате расследования выяснилось, что на сервере был некорректно установлен другой софт.
Re[3]: Автостарт сервиса написанного на .net
От: Mike Chaliy Украина http://chaliy.name
Дата: 23.01.06 21:14
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>Пробовали сформировать имиджи в нативном коде через ngen. Но это не помогло...


Интересно каким то образом можно прикрутить какой нить профайлер к этому всему делу? У меня вся реализация сервиса обычно находится в отдельной длл и для нее существует тестовая консолька. А вот как к сервису прикрутить пофайлер я не знаю .

Может постаить ей рекавери через 0 минут? Пусть сама себя рестарит?
А тут я живу и пишу...
Re[4]: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 24.01.06 08:50
Оценка:
Здравствуйте, Mike Chaliy, Вы писали:

MC>Здравствуйте, Дмитрич, Вы писали:


Д>>Пробовали сформировать имиджи в нативном коде через ngen. Но это не помогло...


MC>Интересно каким то образом можно прикрутить какой нить профайлер к этому всему делу? У меня вся реализация сервиса обычно находится в отдельной длл и для нее существует тестовая консолька. А вот как к сервису прикрутить пофайлер я не знаю .


MC>Может постаить ей рекавери через 0 минут? Пусть сама себя рестарит?


Рестарт сервиса стоит,но он не помагает. В журналах системы не видно, чтобы система пробовала рестартовать сервис
Re[6]: Автостарт сервиса написанного на .net
От: Дмитрич Россия  
Дата: 24.01.06 09:32
Оценка:
Здравствуйте, Red Bird, Вы писали:

RB>Здравствуйте, Дмитрич, Вы писали:


Д>>Здравствуйте, Engineer, Вы писали:


RB>[skip]


Д>>Замечена ещё одна особенность. Не стартует в случае некорректного выключения питания. В случае же, если сервис успешно останавливает свою работу, то после он успешно стартует.


RB>Все же думаю, что проблема в алгоритме...


RB>Для того чтобы исключить "кривизну ОС" попробуйте написать "пустой" сервис, который ничего не делает.

RB>Установите его "рядышком" с основным сервисом и пробуйте смоделировать ситуацию.

RB>Если окажется, что "пустой" сервис тоже не запускается, то дело, скорее всего в ОС, реестре и т.п. на конкретной машине.


RB>У меня была похожая ситуация, когда сервис работал на всех машинах кроме одной (на которой он и должен был эксплуатироваться) в результате расследования выяснилось, что на сервере был некорректно установлен другой софт.


Проблема в том, что в сервис включено логирование в процедуру Main. Так даже это логирование не выходит. Хотя один раз проскочило одна из записей о том что сервис начинает запуск. Но в тоже самое время идет запись об ошибке от SCM (сервис не отвечает 30 секунд), т.е. сервис начал инициализацию и тут же был прибит SCM'ом. К тому же сервис не то чтобы не работает, если запустить в ручном режиме то он пашет, а в том что автостарт не всегда срабатывает, а надо чтобы сервис сам запускался.
Re[5]: Автостарт сервиса написанного на .net
От: Mike Chaliy Украина http://chaliy.name
Дата: 24.01.06 10:19
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>Здравствуйте, Mike Chaliy, Вы писали:


MC>>Здравствуйте, Дмитрич, Вы писали:


Д>>>Пробовали сформировать имиджи в нативном коде через ngen. Но это не помогло...


MC>>Интересно каким то образом можно прикрутить какой нить профайлер к этому всему делу? У меня вся реализация сервиса обычно находится в отдельной длл и для нее существует тестовая консолька. А вот как к сервису прикрутить пофайлер я не знаю .


MC>>Может постаить ей рекавери через 0 минут? Пусть сама себя рестарит?


Д>Рестарт сервиса стоит,но он не помагает. В журналах системы не видно, чтобы система пробовала рестартовать сервис


А у вас есть возможность пустой сервис на проблемных машинах запустить?

А еще, я конешно не знаю, но может ли лог4нет некорректно закрывать файл(в смыле перегрузок или еще ченить), а потом его слишком долго открывать? Или создавать долго? Может быть времнно бахнуть лог4нет?
А тут я живу и пишу...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.