2009-07-30 6 views
1

Кто-нибудь знает, как определить, не удалось или удалось удаленное приложение? Я имею в виду, когда он становится непригодным - в этом случае вы обычно видите «Не реагировать» в строке заголовка, но ключ заключается в том, что приложение все еще работает; поэтому просто найти процесс, который больше не работает, недостаточно.C# Обнаружение сбоя удаленного приложения

WMI не поддерживает использование System.Diagnostics.Process.Responding на удаленной машине .. и, похоже, они не являются никакими другими свойствами WMI. Я могу запросить в Win32_Process для такого рода информации.

ответ

0

При определении «жизнеспособности» программы важно измерить этот аспект, который определяет, что он жив в полезной манере.

Несколько простых подходов «прокси» являются поверхностно привлекательными из-за их простоты, но принципиально не измеряют важный аспект.

Пожалуй, наиболее распространенными являются «Является ли процесс живой» и «отдельный сердцебиения широковещательный поток», вероятно, потому что это так просто сделать:

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

Оба они, однако, имеют серьезный недостаток, если реальные рабочие потоки (ы) в вашем приложении блокируются (скажем, в бесконечном цикле или в тупике), тогда вы будете продолжать весело отправлять сообщения OK. Для мониторинга на основе процесса вы будете продолжать видеть процесс «живым», несмотря на то, что он больше не выполняет эту задачу.
Вы можете улучшить поток одним способом (значительно увеличивая сложность и вероятность проблем с потоками), накладывая на тесты на прогресс в основной теме, но это делает неправильное решение и пытается подтолкнуть его к правильному.

Что лучше всего сделать задачей (задачами), выполняемой частью программы проверки жизнеспособности. Возможно, чтобы сердце билось непосредственно из основного потока после выполнения каждой подзадачи (с порогом, чтобы убедиться, что это не происходит слишком часто) или просто посмотреть на выход (если он существует) и убедиться, что входы приводят к выходам.

Лучше еще проверить это как внутри, так и снаружи (особенно, если есть внешние потребители/пользователи программы). Если у вас есть веб-сервер: попытайтесь его использовать, если ваше приложение представляет собой систему на основе цикла событий: инициировать события, на которые он должен ответить (и проверить правильность вывода). Что бы ни было сделано, всегда считайте, что вы хотите проверить, что полезно, и правильное поведение происходит, а не просто какая-либо деятельность вообще.

Чем больше вы проверите не только о существовании программы, но это действия тем более полезной будет ваша проверка. Вы проверите больше системы, чем дальше вы выберете себя из внутреннего состояния, если вы запустите процесс мониторинга на ящике, вы можете проверять только локальную петлю, при запуске ящик проверяет гораздо больше сетевого стека, включая часто забытые аспекты, такие как DNS ,

Неизбежно это делает проверку сложнее, потому что вы, по сути, думаете о конкретной задаче, а не об общем решении, дивиденды от этого должны приносить достаточные выгоды, чтобы этот подход серьезно рассматривался во многих случаях.

+0

Большое спасибо за это понимание; наиболее полезный. Я думаю, что этот метод лучше всего соответствует моим потребностям. – pierre

0

Вы можете использовать механизм опроса и периодически запрашивать статус удаленного приложения.

0

Трудно определить, произошло ли повреждение приложения или что-то полезное.

Рассмотрим это:

while(true); 

процессор (очень) занят. И это может даже ответить, если это сделано в отдельном потоке. Однако это действительно нежелательное поведение, так как приложение больше не работает.

Лучший способ справиться с этим - периодически (в некоторых случаях в программном обеспечении) добавлять определенные счетчики и транслировать их. Приложение watchdog может прослушивать эти трансляции, и если они больше не приходят или не имеют смысла (счетчик не складывается), вы можете убить процесс и перезапустить его.

Вещание может осуществляться несколькими способами. Проще всего просто написать счетчики в файл (убедитесь, что файл заблокирован, когда вы пишете в нем, поэтому процесс чтения не получает половину искаженного файла, когда он читает его в то же самое время)

еще расширенные способы - использовать именованные каналы или использовать сокет. UDP-разъем очень прост в настройке и использовании в этом случае. Не беспокойтесь о «packetloss», поскольку в локальной сети это почти никогда не происходит.

Смежные вопросы