четверг, 23 апреля 2015 г.

Отложенный запуск службы

Вводная: На одном сервере есть две службы - сервер баз данных и приложение (в виде службы) которое обращается к базе данных.
Столкнулся с тем, что служба БД запускается позже, чем приложение и в итоге программа висит с ошибкой подключения (переписать приложение не вариант).

Решение: Есть два способа
1) Поставить в свойствах службы тип запуска "Автоматически (отложенный запуск)". Система запускает такие службы только после того, как запущены все службы, настроенные на автоматический запуск. Запуск отложенных служб осуществляется с самым низким приоритетом, что позволяет сэкономить ресурсы компьютера при загрузке этих служб. 
Но у этого решения есть свой минус - если есть три службы А, зависимая Б и любая сторонняя В. И нам надо сделать запуск Б, только после А. У А и В тип запуска "Автоматически", предположим, что левая служба В зависла при запуске. Тогда даже при работающей А и возможным запуском Б, Б не будет запущена, так как будет ожидать запуск службы В.

2) Более корректный способ это поставить службу приложения в зависимость от службы БД. Теперь служба будет ждать запуска именно сервера БД и сразу после него стартовать сама.
Делается это через командную строку -
sc config ИмяСлужбыПриложения depend= ИмяСлужбыБД/ все дополнительные зависимости, перечисленные через / прямой слеш

Причём после "depend=" должен быть обязательно пробел!

Посмотреть зависимости (и прочие параметры) можно

sc qc ИмяСлужбыПриложения