Reiniciar um serviço com serviços dependentes?
Iniciando com um csharp-example e observando devidamente as questões SO relacionadas Reinicie serviços do Windows a partir de C # eNão é possível reiniciar um Serviço) e várias outras perguntas relacionadas arestarting apenas um serviço, Estou me perguntando qual é o melhor método para reiniciando um serviçocom serviços dependentes (por exemplo.Message Queuing
, no qualMessage Queuing Triggers
depende ouIIS
, no qualFTP Publishing
eWorld Wide Web Publishing
depende). O snap-in mmc faz isso automaticamente, mas o código não parece fornecer a mesma funcionalidade (pelo menos não tão facilmente
ocumentação do @MSDN para Stop diz "Se algum serviço depender deste serviço para sua operação, ele será interrompido antes da interrupção do serviço. A propriedade DependentServices contém o conjunto de serviços que dependem deste" eDependentServices
retorna uma matriz de serviços. AssumindoStartService()
eStopService()
siga as convenções descritas nos exemplos e acima mencionados (exceto que eles aceitamServiceControllers
eTimeSpans
diretamente), comecei com:
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);
}
}
Mas e se as dependências de serviço forem aninhadas (recursivas) ou cíclicas (se isso é possível ...) - seService A
édepended on porService B1
eService B2
eService C1
depende d Service B1
, parece 'reiniciar'Service A
por esse método parariaService C1
mas não o reiniciaria ...
Para tornar esta imagem mais clara, seguirei o modelo no snap-in mmc de serviços:
The following system components depend on [Service A]:
- Service B1
- Service C1
- Service B2
Existe uma maneira melhor de fazer isso, ou seria necessário entrar e parar recursivamente cada serviço dependente e, em seguida, reiniciar todos eles após reiniciar o serviço principa
Adicionalmente, serádependent mas atualmente parado services estão listados em DependentServices? Se sim, isso não os reiniciaria de qualquer maneira? Nesse caso, devemos controlar isso também? Isso parece ficar cada vez mais bagunçado ...
* Nota: eu percebo otimeout
não está sendo aplicado completamente corretamente aqui (o tempo limite geral pode ser muitas vezes maior que o esperado), mas por enquanto não é esse o problema que me preocupa - se você deseja corrigi-lo, tudo bem, mas não basta dizer 'tempo esgotado ...'
Atualizarpós alguns testes preliminares, descobri (/ confirmei) os seguintes comportamentos:
Parar um serviço (por exemplo,Service A
) que outros serviços (por exemplo,Service B1
) depende de interromperá os outros serviços (incluindo dependências "aninhadas", comoService C1
)DependentServices
fa incluem serviços dependentes em todos os estados (Em execução, Interrompido etc.) e também inclui dependências aninhadas, ou seja,Service_A.DependentServices
conteria{Service B1, Service C1, Service B2}
(nessa ordem, comoC1
depende deB1
).Iniciar um serviço que depende de outras pessoas (por exemplo,Service B1
depende d Service A
) também iniciará os serviços necessário O código acima pode, portanto, ser simplificado (pelo menos em parte) para interromper o serviço principal (que interromperá todos os serviços dependentes) e reiniciar os serviços mais dependentes (por exemplo,Service C1
eService B2
) (ou apenas reiniciar "todos" os serviços dependentes - ele ignorará os que já foram iniciados), mas isso realmente adia momentaneamente o início do serviço principal até que uma das dependências se queixe, então isso realmente não ajuda .
or enquanto, parece que apenas reiniciar todas as dependências é a maneira mais simples, mas isso ignora (por enquanto) o gerenciamento de serviços que já estão parados e .