Pergunta

Alguém sabe de uma maneira de detectar se um aplicativo remoto falhou / caiu? Estou significado quando se torna inutilizável - normalmente você veria "Não está respondendo" na barra de título, neste caso - mas o fundamental é que o aplicativo ainda está em execução; portanto, apenas encontrar o processo não está mais funcionando, não é suficiente.

WMI não suporta o uso de System.Diagnostics.Process.Responding em uma máquina remota .. e sua parece não haver outras propriedades WMI posso consulta no Win32_Process para este tipo de informação.

Foi útil?

Solução

Na determinação 'vivacidade' de um programa é importante para medir esse aspecto as define estar vivo de uma forma útil.

abordagens Vários simples 'procuração' são superficialmente atraente devido à sua simplicidade, mas fundamentalmente não medem o aspecto importante.

Talvez o mais comum são os "É o processo vivo" e "thread transmissão batimentos cardíacos separado" provavelmente porque é tão simples de fazer:

bool keepSending = true; // set this to false to shut down the thread
var hb = new Thread(() => 
    {
         while (true)
             SendHeartbeatMessage();   
    }).Start();

Ambos têm, contudo, uma falha grave, se o segmento real de trabalho (s) em seu bloqueio aplicativo up (dizem que vai em um loop infinito ou um impasse), então você vai continuar a alegremente enviar mensagens OK. Para o processo com base de monitoramento você vai continuar a ver o processo 'vivo', apesar de já não realizá-lo é tarefa real.
Você pode melhorar a uma linha de muitas maneiras (aumentando significativamente os problemas de segmentação de complexidade e oportunidade) por camadas em testes para o progresso no segmento principal, mas isso leva a solução errada e tenta empurrá-lo para o caminho certo.

O que é melhor é fazer a tarefa (s) realizada pela parte do programa do cheque liveness. Talvez a pulsação do coração diretamente a partir do thread principal depois de cada tarefa sub feito (com um limiar para garantir que isso não acontece muitas vezes) ou para simplesmente olhar para a saída (se existir) e garantir que as entradas estão resultando em saídas.

É melhor ainda para validar este tanto internamente (dentro do programa) e externamente (especialmente se houver consumidores / usuários externos do programa). Se você tiver um servidor web: tentar usá-lo, se o seu aplicativo é algum sistema baseado ciclo de eventos: eventos de disparo para o qual ele deve responder (e verificar a saída está correta). Tudo o que é feito sempre em consideração que você deseja verificar se útil e comportamento correto está ocorrendo em vez de apenas qualquer atividade em tudo.

Quanto mais você verificar não só a existência do programa, mas é acções o mais útil o seu cheque será. Você vai verificar mais do sistema quanto mais você colocar-se do estado interno, se você executar o seu processo de monitor na caixa só pode verificar auto-retorno local, correndo os valida caixa muito mais da pilha de rede, incluindo aspectos muitas vezes esquecidos como DNS .

Inevitavelmente, isso faz com que a verificação mais difícil de fazer, porque você está inerentemente pensar em uma tarefa específica, em vez de uma solução geral, os dividendos deste deve render benefícios suficientes para esta abordagem para ser seriamente considerada, em muitos casos.

Outras dicas

É difícil saber se um aplicativo caiu ou está realmente fazendo algo útil.

Considere o seguinte:

 while(true);

O processador é (muito) ocupado. E pode até responder se isso for feito em um segmento separado. No entanto, este é um comportamento realmente indesejada uma vez que o aplicativo não está mais funcionando.

A melhor maneira de lidar com isso é periodicamente (em certos pontos do software) adicionar alguns contadores e transmitir estes. Um aplicativo de vigilância pode ouvir estas transmissões e se eles não chegam ou fazer mais sentido (contador não faz sentido), então você pode matar o processo e reiniciá-lo.

Broadcasting pode ser feito de várias maneiras. Mais fácil é apenas escrever os contadores para um arquivo (certifique-se o arquivo está bloqueado quando você escrever nele assim que um processo de leitura não fica meio desconfigurado arquivo quando ele é lê-lo no exato mesmo tempo)

formas mais avançadas é usar pipes nomeados, ou para usar um soquete. socket UDP é muito fácil de configurar e usar neste caso. Não se preocupe com 'packetloss' uma vez em uma rede local isso quase nunca acontece

Você pode usar o mecanismo de pesquisa e, periodicamente, pedir o status do aplicativo remoto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top