Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Создание сервиса в другом сервисе


Автор: Sheff 16.11.2007, 00:41
Всем привет!
Суть проблемы такая: Есть сервис (Будем называть его сервис 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 запущен

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

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

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

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

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

Автор: Sheff 17.11.2007, 21:22
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, тем самым, запускаясь

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)