¿Reiniciar un servicio con servicios dependientes?
Comenzando con una csharp-example y teniendo debidamente en cuenta las preguntas SO relacionadas Reinicie los servicios de Windows desde C # y No se puede reiniciar un Servicio) y varias otras preguntas relacionadas con reiniciar solo un servicio, Me pregunto cuál es el mejor método para reiniciar un serviciocon servicios dependientes (p.ej.Message Queuing
, en la queMessage Queuing Triggers
depende oIIS
, en la queFTP Publishing
yWorld Wide Web Publishing
depender). El complemento mmc hace esto automáticamente, pero el código no parece proporcionar la misma funcionalidad (al menos no tan fácilmente).
ocumentación de @MSDN para Stop dice "Si algún servicio depende de este servicio para su funcionamiento, se detendrá antes de que se detenga este servicio. La propiedad DependentServices contiene el conjunto de servicios que dependen de este", yDependentServices
devuelve una variedad de servicios. AsumiendoStartService()
yStopService()
siga las convenciones descritas en los ejemplos y los mencionados anteriormente (excepto que aceptanServiceControllers
yTimeSpans
directamente), comencé con:
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);
}
}
Pero, ¿y si las dependencias del servicio están anidadas (recursivas) o cíclicas (si eso es posible ...)? SiService A
esdepende d porService B1
yService B2
yService C1
depende d Service B1
, parece 'reiniciar'Service A
por este método detendríaService C1
pero no lo reiniciaría ...
Para que esta imagen de ejemplo sea más clara, seguiré el modelo en el complemento mmc de servicios:
The following system components depend on [Service A]:
- Service B1
- Service C1
- Service B2
¿Hay una mejor manera de hacerlo, o tendría que intervenir recursivamente y detener cada servicio dependiente y luego reiniciarlos todos después de reiniciar el servicio principal?
Adicionalmente, serádependient pero actualmente se detuvo ¿los servicios se enumerarán en Servicios dependientes? Si es así, ¿no los reiniciaría de todos modos? Si es así, ¿deberíamos controlar eso también? Esto parece ponerse más y más desordenado ...
* Nota: me doy cuenta de latimeout
no se está aplicando completamente correctamente aquí (el tiempo de espera total podría ser muchas veces más largo de lo esperado), pero por ahora ese no es el problema que me preocupa; si desea solucionarlo, está bien, pero no diga 'se acabó el tiempo de espera ...'
Actualizar Después de algunas pruebas preliminares, he descubierto (/ confirmado) los siguientes comportamientos:
Detener un servicio (por ejemplo,Service A
) que otros servicios (por ejemplo,Service B1
) dependerá detendrá los otros servicios (incluidas las dependencias "anidadas" comoService C1
)DependentServices
hac incluye servicios dependientes en todos los estados (en ejecución, detenido, etc.), y también incluye dependencias anidadas, es decir,Service_A.DependentServices
contendría{Service B1, Service C1, Service B2}
(en ese orden, comoC1
depende deB1
).Iniciar un servicio que depende de otros (por ejemplo,Service B1
depende d Service A
) también iniciará los servicios necesarios.or lo tanto, el código anterior se puede simplificar (al menos en parte) para simplemente detener el servicio principal (que detendrá todos los servicios dependientes) y luego reiniciar los servicios más dependientes (por ejemplo,Service C1
yService B2
) (o simplemente reiniciando "todos" los servicios dependientes; se omitirán los que ya se iniciaron), pero eso realmente retrasa momentáneamente el inicio del servicio principal hasta que una de las dependencias se queje, por lo que eso realmente no ayuda .
Mira por ahora como simplemente reiniciar todas las dependencias es la forma más simple, pero eso ignora (por ahora) la administración de servicios que ya están detenidos y tal ...