Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание сервиса в другом сервисе 
V
    Опции темы
Sheff
Дата 16.11.2007, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



Всем привет!
Суть проблемы такая: Есть сервис (Будем называть его сервис 1), который запускаясь (т.е в своей функции Start()) создаёт другой сервис (сервис ядра если быть точнее, будем называть его сервис 2) при помощи CreateService и т.д. Так вот, если сервис 1 запускать руками, то всё в порядке, сервис 2 стартует без замедления, но если выставить сервису 1 autorun и перезагрузить комп то происходит следующее:
1) Система загружается, как будто всё ok, но ни сервис 1 ни сервис 2 не запускаются, EventLog ничего не сообщает
2) примерно через минуту оба сервиса запускаются, и в Event Log'е появляется примерно следующее:

* Service 1 hung during startup
* запущен сервис какой-то там...
* запущен сервис какой-то там...
* Service 2 запущен
* Service 1 запущен

В чём может быть дело ? Может быть это не совсем корректно, запускать один сервис из под другого ? Если так, то почему при запуске руками всё нормально...


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Baa
Дата 16.11.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 1
Всего: 12



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

Это сообщение отредактировал(а) Baa - 16.11.2007, 17:00


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Sheff
Дата 17.11.2007, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



Baa, идея ясна. Просто не хотелось бы инсталлировать два сервиса, хочу инсталлить один, а он в свою очередь пусть запускает кернеловский по желанию, не хочу чтобы запись о кернел сервисе постоянно висела в базе сервисов...

А вообще, я с этим всем немного поигрался и выяснил почему таки происходит подвисание, оказывается, ядерный сервис ждёт десктопа, т.е пока кто-нить не залогинится, а до того момента загрузится он не может, а т.к создаётся ядерный сервис в OnStart'е, то висит и главный сервис. Нужно каким-то образом дать понять ядерному сервису что он должен запуститься немедленно, а не ждать логина...


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
tol05
Дата 17.11.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Sheff, покажи код сервисов. Саму бизнес-логику не нужно, только инсталлеры, их запуск и запуск сервисов.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Sheff
Дата 17.11.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



tol05, вобщем примерно так:
Код

protected override void OnStart( string[] args )
{
...
hDriver = CreateService(    hSCM,
            TEXT(APIHOOK_DEVICE_SERVICE_NAME),
            TEXT(APIHOOK_DEVICE_SERVICE_INFO),
            SERVICE_ALL_ACCESS,
            SERVICE_KERNEL_DRIVER,
            SERVICE_DEMAND_START,
            SERVICE_ERROR_NORMAL,
            &driverPath[0],
            NULL,
            NULL,
            NULL,
            NULL,
            NULL    );
...
}

А вообще, я кажется разобрался, если вынести CreateService и всё что с ним связано в отдельный поток, то всё ok, сначала запускается сервис 1, затем сервис 2. Видимо менеджер сервисов винды синхронный, пока один сервис не запустится он других создавать не может, поэтому и было так:

* Сервис 1 стартует, запускает сервис 2
* Сервис 2 ждёт пока сервис менеджер освободится
* Сервис менеджер не освобождается, т.к сервис один не завершил запуск
* Проходит минуты 2-3, сервис менеджер забивает на сервис 1, пишет в лог - halted
* Загружает сервис 2
* И тут как раз сервис 1 оживает и заканчивает свой OnStart, тем самым, запускаясь

Вот примерно такой сценарий я и наблюдал, но теперь всё впорядке, вроде бы.

Это сообщение отредактировал(а) Sheff - 17.11.2007, 21:23


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
tol05
Дата 17.11.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(Sheff @  17.11.2007,  20:22 Найти цитируемый пост)
Видимо менеджер сервисов винды синхронный, пока один сервис не запустится он других создавать не может

да, он синхронный. 30 секунд на проход от точки входа до OnStart() и 30 секунд на отработку OnStart(). 

И все, всегда, рекомендуют по максимуму выносить логику во внешние потоки... С сервисами - самое главное - пораньше вернуть управление основному потоку.

Молодец, что добил тему сам smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0921 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.