Windows. отслеживать службой работоспособность приложений
От: dmitry251  
Дата: 20.06.23 10:13
Оценка:
Всем привет.
Есть программка, используется в основном на терминальных серверах. состоит из службы и запускаемых этой службой в пользовательских сессиях приложений.
возникла проблема, что приложения иногда зависают. причину выяснить не могу, лог у приложений есть, визуальной части нет. в логе просто перестает работать приложение, как будто бы убит процесс. но процесс не убит, так как служба следит за этим — для каждой пользовательской сессии запустит процесс, если он отсутствует. просто видимо этот процесс зависает, либо его что-то останавливает (что — понять не могу, антивируса нет, в журнале windows чисто, дамп сделать тоже не успеваю, утечек тоже не вижу никаких).

если бы я мог службой видеть, что приложение не отвечает, я бы быстро его убивал и запускал заново. проблема сильно редкая, может месяцами работать норм, и вдруг ни с того ни с сего перестать у 1-2 пользаков.

посоветуйте пожалуйста способ, быстрый, надежный, простой — как отслеживать состояние работы приложения? по cpu не вариант. через windows pipe пробовал делать опрос, но работает как-то ненадежно, не всегда получается вообще этот pipe организовать, особенно если уже был ранее вход-выход пользователя... куда то писать в реестр каждому приложению что-то? или файлово как то сделать? или может еще есть какой способ? служба запущена с правами SYSTEM, каждое приложение — пользовательские права, чаще всего не админские.
Re: Windows. отслеживать службой работоспособность приложений
От: klopodav  
Дата: 20.06.23 10:53
Оценка: +1
D>посоветуйте пожалуйста способ, быстрый, надежный, простой — как отслеживать состояние работы приложения? по cpu не вариант. через windows pipe пробовал делать опрос, но работает как-то ненадежно, не всегда получается вообще этот pipe организовать, особенно если уже был ранее вход-выход пользователя... куда то писать в реестр каждому приложению что-то? или файлово как то сделать? или может еще есть какой способ? служба запущена с правами SYSTEM, каждое приложение — пользовательские права, чаще всего не админские.

Ну, можно сделать какой-нибудь банальный и кондовый вариант типа heartbeat. Пусть каждое приложение через определенные промежутки времени пишет свой файл и перезаписывает в нем какую-то инфу — ну хотя бы дату-время. Если инфа долго не обновляется — значит, зависло. Если на зависание надо реагировать быстро — такой вариант не очень хорош, если же таких требований нет — то вполне норм.

Тут могут быть небольшие проблемы, но они в принципе решаемые. Если работа приложения асинхронная и многопоточная — может оказаться, что приложение живо, но самый важный рабочий поток висит.
Но можно и каждому потоку назначить свой отдельный файл. Если же приложение однопоточное — может оказаться, что какая-то функция работает долго, и приложение как будто висит. Но тогда надо обновлять файл в цикле внутри этой тяжелой функции. Еще могут быть длительные запросы, которые не отслеживаются напрямую изнутри самого приложения — например, если оно обращается к базе, долбится в сеть и т.п. В этих случаях методы отслеживания прогресса таких длительных запросов надо уже подбирать индивидуально.
Re: Windows. отслеживать службой работоспособность приложений
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 20.06.23 14:30
Оценка:
Здравствуйте, dmitry251, Вы писали:

D>в логе просто перестает работать приложение, как будто бы убит процесс. но процесс не убит


Значит, лог недостаточно подробный.

D>если бы я мог службой видеть, что приложение не отвечает, я бы быстро его убивал и запускал заново.


А я бы перед этим еще и делал дамп.

D>посоветуйте пожалуйста способ, быстрый, надежный, простой — как отслеживать состояние работы приложения?


Создавать для каждого процесса общий файл размером в страницу с отображением на память, и нехай процесс периодически там хоть слово инкрементит, хоть текущее время обновляет. Если в процессе больше одного потока — каждый поток должен отмечаться в отдельном слове.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.