Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .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, вобщем примерно так:
А вообще, я кажется разобрался, если вынести CreateService и всё что с ним связано в отдельный поток, то всё ok, сначала запускается сервис 1, затем сервис 2. Видимо менеджер сервисов винды синхронный, пока один сервис не запустится он других создавать не может, поэтому и было так: * Сервис 1 стартует, запускает сервис 2 * Сервис 2 ждёт пока сервис менеджер освободится * Сервис менеджер не освобождается, т.к сервис один не завершил запуск * Проходит минуты 2-3, сервис менеджер забивает на сервис 1, пишет в лог - halted * Загружает сервис 2 * И тут как раз сервис 1 оживает и заканчивает свой OnStart, тем самым, запускаясь Вот примерно такой сценарий я и наблюдал, но теперь всё впорядке, вроде бы. |