Начиная с csharp-примера и должным образом отмечая связанные вопросы SO ( Перезапустите службы Windows из C # и Невозможно перезапустить службу ) и различные другие вопросыОтносительно перезапуска только одной службы , мне интересно, как лучше всего перезапустить службу с зависимыми службами (например, Message Queuing
, на которой Message Queuing Triggers
зависит, или IIS
, от которого зависят FTP Publishing
и World Wide Web Publishing
).Оснастка mmc делает это автоматически, но, похоже, код не обеспечивает такую же функциональность (по крайней мере, не так просто).
Документация MSDN для Stop говорит: «Если какие-либо службызависит от этой службы для их работы, они будут остановлены до того, как эта служба будет остановлена. Свойство DependentServices содержит набор служб, которые зависят от этой службы ", и DependentServices
возвращает массив служб.Предполагая, что StartService()
и StopService()
следуют соглашениям, изложенным в примерах, и указанным выше (за исключением того, что они принимают ServiceControllers
и TimeSpans
напрямую), я начал с:
public static void RestartServiceWithDependents(ServiceController service, TimeSpan timeout)
{
ServiceController[] dependentServices = service.DependentServices;
RestartService(service, timeout); // will stop dependent services, see note below* about timeout...
foreach (ServiceController dependentService in dependentServices)
{
StartService(dependentService, timeout);
}
}
Но что еслисервисные зависимости являются вложенными (рекурсивными) или циклическими (если это даже возможно ...) - если Service A
равно зависит от от Service B1
и Service B2
и Service C1
зависит от Service B1
, кажется, что «перезапуск» Service A
таким способом остановит Service C1
, но не перезапустит его ...
Чтобы сделать этот пример более понятным, я буду следоватьмодель в оснастке mmc служб:
The following system components depend on [Service A]:
- Service B1
- Service C1
- Service B2
Есть ли лучший способ сделать это, или нужно просто рекурсивно входить и останавливать каждую зависимую службу, а затем перезапускать их все после перезапускаосновной сервис?
Кроме того, будут ли зависимые но в настоящее время остановленные сервисы перечислены в списке DependentServices?Если так, разве это не перезапустит их в любом случае?Если да, то должны ли мы это контролировать?Кажется, что это становится все более и более запутанным ...
* Примечание: я понимаю, что timeout
применяется не совсем корректно (общее время ожидания может быть во много раз больше, чем ожидалось), но сейчасэто не та проблема, о которой я беспокоюсь - если вы хотите это исправить, хорошо, но не говорите «тайм-аут сломан ...»
Обновление: После некоторого предварительного тестированияЯ обнаружил (/ подтвердил) следующее поведение:
- Остановка службы (например,
Service A
), от которой зависят другие службы (например, Service B1
), остановит другие службы (включая "вложенные "зависимости", такие как Service C1
) DependentServices
, включают зависимые службы во всех состояниях (работает, остановлен и т. д.), а также включаютвложенные зависимости, т.е. Service_A.DependentServices
будет содержать {Service B1, Service C1, Service B2}
(в этом порядке, поскольку C1
зависит от B1
). - Запуск службы, зависящей от других (например,
Service B1
зависит Service A
) также запустит необходимые службы.
TПоэтому приведенный выше код можно упростить (по крайней мере, частично), чтобы просто остановить основной сервис (который остановит все зависимые сервисы), а затем перезапустить наиболее зависимые сервисы (например, Service C1
и Service B2
) (или просто перезапустить "все "зависимые сервисы - он пропустит уже запущенные), но это на самом деле просто на мгновение откладывает запуск основного сервиса до тех пор, пока одна из зависимостей не пожалуется на это, так что это действительно не поможет.
Похоже, что простой перезапуск всех зависимостей - это самый простой способ, но он игнорирует (на данный момент) управление службами, которые уже остановлены и тому подобное ...