2014-02-15 3 views
0

Допустим, у меня есть приложение Windows с именем app.exe, написанное на C# (Windows Forms), работающее без присмотра под любой ОС Windows (от XP до 8).Как контролировать состояние приложения Windows C#?

Я хотел бы отслеживать состояние приложения:

  • приложение все еще работает или он разбился
  • Имеет приложение запустить во внутреннее состояние ошибки

мою идею заключается в настройке запланированной задачи в Windows (с помощью планировщика заданий) для запуска приложения Windows Console, monitor.exe, каждые 15 минут. Приложение монитора отправит электронное письмо со статусом app.exe.

То, что я не был в состоянии выяснить:

  • Как узнать, если app.exe все еще работает?
  • Как получить доступ к внутренней переменной в app.exe от monitor.exe?

Одна идея состояла в том, чтобы установить таймер в app.exe, который будет писать внутреннее состояние в файл, и иметь monitor.exe чтения и оценить, что файл каждые 15 минут. Но для меня это не очень элегантно (однако это сработает).

У вас есть лучшая, лучшая практика, подход?

ответ

1

Вот еще более сложное решение, которое можно было бы добавить к уровню монитора и уровню обслуживания в app.exe. Уровень монитора отвечает за сбор состояния внутренних переменных, и уровень обслуживания отвечает за предоставление внутреннего статуса, которому выдают запрос GetStatus.

Всякий раз, когда monitor.exe выполняется, он выдает запрос GetStatus услуг в app.exe, и получить ответ о том, что происходит изнутри app.exe.

Недостаток заключается в том, что вы должны создать соединение между app.exe и monitor.exe, а последнее должно знать служебный порт всего app.exe, который развернут на локальном компьютере.

+0

Привет, сетт, мне нравится эта идея. Вы имеете в виду что-то вроде именованной трубы? Где вы можете локально обмениваться сообщениями клиента и сервера? – Sebastian

+0

@Sebastian Да, названная труба в порядке. Детальная реализация может быть разной. – ssett

+0

В итоге я использовал именованные каналы для межпроцессного взаимодействия (IPC). Эта концепция была совершенно новой для меня, поэтому спасибо @ssett за то, что указали мне в правильном направлении! – Sebastian

0

Вы можете отправить сообщение от app.exe по таймеру для получения статуса, и если вы не получили почту последние 15 минут, это означает, что приложение было разбито или закрыто.

Или создайте попытку/уловку для операций по сбору информации об авариях аварий и отправьте их по электронной почте, которая также включает текущий статус.

+0

Привет, TC Alper Tokcan, я хотел бы реализовать отправку электронной почты в файле monitor.exe, так как я хочу повторно использовать monitor.exe для других app.exes. Таким образом, мне нравится знать, кому нужно получить доступ к статусу app.exe. Спасибо! (: – Sebastian

+0

@Sebastian Я думаю, что только путь для связи «app.exe» с 'monitor.exe' - это сохранение файла из' app.exe', который имеет некоторую информацию о статусе и считывает его с 'monitor.exe' :) –

2

Счетчики производительности идеально подходят для этого. У меня есть несколько приложений .Net, которые используют счетчик PerformanceCounterType.ElapsedTime и задают «последнее проверенное время» в основном цикле.

Затем я отслеживаю этот счетчик с централизованной системой мониторинга и уведомлений. (Мы используем SolarWinds на работе) Если я ожидаю, что что-то будет запускаться каждую минуту, а счетчик превысит 5 минут, предупреждения будут отключены.

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