Pregunta

¿Alguien sabe de una manera de detectar si una aplicación remota ha fallado / se ha bloqueado? Lo que quiero decir es que cuando se vuelve inutilizable, por lo general vería " No responde " en la barra de título, en este caso, pero la clave es que la aplicación aún se está ejecutando; por lo tanto, encontrar el proceso que ya no se está ejecutando no es suficiente.

WMI no admite el uso de System.Diagnostics.Process.Responding en una máquina remota ... y parece que no son otras propiedades de WMI que puedo consultar en Win32_Process para este tipo de información.

¿Fue útil?

Solución

Al determinar la "vida" de un programa, es importante medir ese aspecto que lo define como estar vivo de una manera útil.

Varios enfoques 'proxy' simples son superficialmente atractivos debido a su simplicidad pero fundamentalmente no miden el aspecto importante.

Quizás los más comunes son el " ¿Está vivo el proceso " y " hilo de difusión de latido del corazón separado " Probablemente porque es tan simple de hacer:

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

Sin embargo, estos dos tienen un defecto grave, si los hilos de trabajo reales en su aplicación se bloquean (por ejemplo, entran en un bucle infinito o un interbloqueo), entonces continuará enviando alegremente mensajes de OK. Para el monitoreo basado en el proceso, continuará viendo el proceso 'vivo' a pesar de que ya no realiza su verdadera tarea.
Puede mejorar el subproceso uno de muchas maneras (aumentando significativamente la complejidad y los problemas de subprocesos aleatorios) si se superponen las pruebas para el progreso en el subproceso principal, pero esto toma la solución incorrecta e intenta empujarlo hacia el correcto.

Lo mejor es hacer que las tareas realizadas por el programa formen parte de la verificación de vida. Quizás al ritmo del corazón directamente desde el subproceso principal después de cada tarea secundaria realizada (con un umbral para garantizar que no ocurra con demasiada frecuencia) o simplemente mirar la salida (si existe) y garantizar que las entradas produzcan salidas.

Es mejor aún validar esto tanto internamente (dentro del programa) como externamente (especialmente si hay consumidores / usuarios externos del programa). Si tiene un servidor web: intente usarlo, si su aplicación es un sistema basado en bucles de eventos: active los eventos a los que debe responder (y verifique que la salida sea correcta). Independientemente de lo que se haga, tenga en cuenta que desea verificar que sea útil y que se produzca un comportamiento correcto en lugar de cualquier actividad en absoluto.

Cuanto más compruebe no solo de la existencia del programa, sino de acciones , más útil será su comprobación. Revisará más del sistema cuanto más se aleje del estado interno. Si ejecuta el proceso de monitoreo en la casilla, solo podrá verificar el bucle de retorno local. La ejecución de la casilla valida mucho más la pila de la red, incluidos los aspectos a menudo olvidados, como el DNS. .

Inevitablemente, esto hace que la verificación sea más difícil, ya que está pensando de forma inherente en una tarea específica en lugar de en una solución general, los dividendos de esto deberían generar beneficios suficientes para que este enfoque se considere seriamente en muchos casos.

Otros consejos

Es difícil saber si una aplicación se ha bloqueado o está haciendo algo útil.

Considera esto:

 while(true);

El procesador está (muy) ocupado. Y podría incluso responder si esto se hace en un hilo separado. Sin embargo, este es un comportamiento realmente no deseado ya que la aplicación ya no funciona.

La mejor manera de abordar esto es periódicamente (en ciertos puntos del software) agregar ciertos contadores y transmitirlos. Una aplicación de vigilancia puede escuchar estas transmisiones y si ya no llegan o no tienen sentido (el contador no se suma), puede detener el proceso y reiniciarlo.

La difusión se puede hacer de varias maneras. Lo más fácil es simplemente escribir los contadores en un archivo (asegúrese de que el archivo esté bloqueado cuando lo escriba para que el proceso de lectura no se convierta en un archivo medio destrozado cuando lo esté leyendo exactamente al mismo tiempo)

formas más avanzadas es utilizar canalizaciones con nombre o usar un socket. El socket UDP es muy fácil de configurar y utilizar en este caso. No se preocupe por la "pérdida de paquetes", ya que en una red local esto casi nunca sucede

Puede usar el mecanismo de sondeo y preguntar periódicamente el estado de la aplicación remota.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top