OVH Cloud OVH Cloud

Détecter une appli Windows en état zombie

12 réponses
Avatar
Patrick \Zener\ BRUNET
Bonjour.

Je fais dans le process sécurisé, et donc j'ai déjà développé un watchdog
logiciel qui surveille un autre process afin de le tuer et relancer s'il se
bloque (je maîtrise mes algos mais pas ce qui se passe dans les librairies
système).

Ca repose évidemment sur un système de heart-beat régulier, mais ce principe
suppose que le process soit conçu en ce sens.

Comment feriez-vous pour surveiller de même une application lambda pour
laquelle ça n'a pas été prévu ?
Il est déjà possible de surveiller son handle de process, ce qui permet de
détecter sa mort éventuelle. Mais si l'application se met dans un état
second, comment le détecter (autrement qu'en essayant de la fermer et en
s'apercevant qu'elle ne répond pas, moi je veux qu'elle reste en
fonctionnement) ?

J'en suis à envisager des choses du style : envoyer périodiquement des
messages de déplacement à sa fenêtre, et vérifier qu'elle obéit, mais c'est
pas évident. Vous voyez plus simple ?

Merci de toute suggestion.

Cordialement,

PZB

10 réponses

1 2
Avatar
Remi Thomas
Patrick "Zener" BRUNET wrote:
Bonjour.

Je fais dans le process sécurisé, et donc j'ai déjà développé un
watchdog logiciel qui surveille un autre process afin de le tuer et
relancer s'il se bloque (je maîtrise mes algos mais pas ce qui se
passe dans les librairies système).

Ca repose évidemment sur un système de heart-beat régulier, mais ce
principe suppose que le process soit conçu en ce sens.

Comment feriez-vous pour surveiller de même une application lambda
pour laquelle ça n'a pas été prévu ?
Il est déjà possible de surveiller son handle de process, ce qui
permet de détecter sa mort éventuelle. Mais si l'application se met
dans un état second, comment le détecter (autrement qu'en essayant de
la fermer et en s'apercevant qu'elle ne répond pas, moi je veux
qu'elle reste en fonctionnement) ?

J'en suis à envisager des choses du style : envoyer périodiquement des
messages de déplacement à sa fenêtre, et vérifier qu'elle obéit, mais
c'est pas évident. Vous voyez plus simple ?

Merci de toute suggestion.

Cordialement,

PZB



Bonjour,
Tu n'as pas forcement à envoyer des messages de déplacement de fenêtre.
Déjà si tu fais un SetFocus sur l'application à surveiller et que tu ne
reçois pas de WM_KILLFOCUS c'est un indice.
Sinon avec un GetWindowText tu devrais t'en sortir.
Extrait MSDN
"If the target window is owned by the current process, GetWindowText causes
a WM_GETTEXT message to be sent to the specified window or control. If the
target window is owned by another process and has a caption, GetWindowText
retrieves the window caption text. If the window does not have a caption,
the return value is a null string. This behavior is by design. It allows
applications to call GetWindowText without hanging if the process that owns
the target window is hung. However, if the target window is hung and it
belongs to the calling application, GetWindowText will hang the calling
application."

Rémi

--
Rémi Thomas - MVP Visual Studio .NET
Développeur Windows indépendant
http://www.xtware.com/cv
Avatar
Christian ASTOR
Patrick "Zener" BRUNET wrote:

J'en suis à envisager des choses du style : envoyer périodiquement des
messages de déplacement à sa fenêtre, et vérifier qu'elle obéit, mais c'est
pas évident. Vous voyez plus simple ?



Par ex, TaskMgr appelle IsHungAppWindow() sous NT/.. (IsHungThread()
sous 9x)
(~SendMessageTimeout())
Avatar
Thierry
Bonjour,

Patrick "Zener" BRUNET a écrit :

J'en suis à envisager des choses du style : envoyer périodiquement des
messages de déplacement à sa fenêtre, et vérifier qu'elle obéit, mais


^^^^^^^^^^ ^^^ ^^^ ^^^^
c'est pas évident. Vous voyez plus simple ?



WM_NULL serait mieux, avec un SendMessageTimeout.
(de toutre façon voir le message de CAstor).

--
"MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"
Avatar
Alexandre
"Thierry" a écrit dans le message de
news:
Bonjour,

Patrick "Zener" BRUNET a écrit :

> J'en suis à envisager des choses du style : envoyer périodiquement des
> messages de déplacement à sa fenêtre, et vérifier qu'elle obéit, mais
^^^^^^^^^^ ^^^ ^^^ ^^^^
> c'est pas évident. Vous voyez plus simple ?

WM_NULL serait mieux, avec un SendMessageTimeout.
(de toutre façon voir le message de CAstor).




Certes mais une application peut ne pas répondre au bout du Timeout est ne
pas être bloquée pour autant... Si elle fait un (long) calcul et qu'elle ne
possède qu'un seul thread... D'accord elle est mal écrite, mais ça c'est vu
;-)
Avatar
Arnaud Debaene
Patrick "Zener" BRUNET wrote:
Bonjour.

Je fais dans le process sécurisé, et donc j'ai déjà développé un
watchdog logiciel qui surveille un autre process afin de le tuer et
relancer s'il se bloque (je maîtrise mes algos mais pas ce qui se
passe dans les librairies système).


J'en suis à envisager des choses du style : envoyer périodiquement des
messages de déplacement à sa fenêtre, et vérifier qu'elle obéit, mais
c'est pas évident. Vous voyez plus simple ?



Une solution empirique éventuellement : faire des stats sur le taux
d'utilisation du processeur pendant une certaine période : Un process qui
reste longtemps à 100% d'utilisation est probablement coincé dans une boucle
sans fin. Ceci dit, tu peux très bien te planter et tuer un processus qui
tournait en fait très bien. AMHA il n'y a pas de solution générique pour
tous les types de processus : ta solution ne marche pas par exemple pour une
application sans GUI.

Arnaud
Avatar
Quentin Pouplard
Alexandre wrote:
"Thierry" a écrit dans le message de
news:
> Bonjour,
>
> Patrick "Zener" BRUNET a écrit :
>
> > J'en suis à envisager des choses du style : envoyer périodiquement
> > des messages de déplacement à sa fenêtre, et vérifier qu'elle
> > obéit, mais ^^^^^^^^^^ ^^^ ^^^ ^^^^ c'est pas évident. Vous
> > voyez plus simple ?
>
> WM_NULL serait mieux, avec un SendMessageTimeout.
> (de toutre façon voir le message de CAstor).
>

Certes mais une application peut ne pas répondre au bout du Timeout
est ne pas être bloquée pour autant... Si elle fait un (long) calcul
et qu'elle ne possède qu'un seul thread... D'accord elle est mal
écrite, mais ça c'est vu ;-)



De toute façon ce problème n'a pas de solution, tu ne peux trouver qu'un
compromis acceptable. A la limite, augmenter le timeout, si le cpu est
utilisé à 100%, mais même là tu peux trouver des cas qui poseront
problèmes.

--
Quentin Pouplard (Tene/MyOE)
http://www.myoe.org | http://graff.alrj.org
Avatar
Patrick \Zener\ BRUNET
"Patrick "Zener" BRUNET" <http://zener131.free.fr/ContactMe> a écrit dans le
message news: 3f8a60c9$0$27046$

Bonjour.

Merci beaucoup de ces suggestions très intéressantes. Je pense que je vais
doter mon Watchdog d'une petite intelligence reposant sur ces différents
indices.

Pour ceux qui seraient intéressés par la suite:

Si le Watchdog conclut que le proicess qu'il surveille est planté, alors il
le tue et tente de le relancer.
Le process normalement utilisé est programmé pour se remettre au travail sur
sa tâche en cours, sinon ça n'a bien sûr aucun intérêt.
Quelquefois, le process est incapable de se remettre au travail (ressource
plantée ou autre). Dans ce cas, le Watchdog après 2 tentatives, décide de
rebooter le système, ce qui suppose que lui-même et le process sont inscrits
dans la liste de démarrage, et qu'un auto-logon est prévu.
Donc le Watchdog commence par envoyer une commande de reboot soft
(fermez-vous svp) afin de laisser une chance aux diverses applis de se
terminer proprement, et après un délai si ça échoue, il commande un reboot
forcé.
Mais ça ne suffit pas, quelquefois windows lui-même est dans un tel état
qu'il est incapable de rebooter (et en général à ce stade le Watchdog est
planté aussi).
Dans ce cas, la seule solution est un reboot hard, ce qui signifie que je
vais devoir coupler mon Watchdog logiciel avec un petit boîtier électronique
contenant un timer redéclenchable, auquel il envoie un heart beat, et
capable d'actionner le contact reset du PC. La solution élégante est de
faire une carte PCI (la revue Elektor a publié tout ce qu'il faut pour
l'interfaçage), la solution économique est de monter ça sur un port série.

Qu'est-ce qu'il ne faut pas faire pour pouvoir compter sur un process !

Cordialement,

PZB
Avatar
Quentin Pouplard
http://zener131.free.fr/ContactMe wrote:
"Patrick "Zener" BRUNET" <http://zener131.free.fr/ContactMe> a écrit
dans le message news: 3f8a60c9$0$27046$

Bonjour.

Merci beaucoup de ces suggestions très intéressantes. Je pense que je
vais doter mon Watchdog d'une petite intelligence reposant sur ces
différents indices.

Pour ceux qui seraient intéressés par la suite:

Si le Watchdog conclut que le proicess qu'il surveille est planté,
alors il le tue et tente de le relancer.
Le process normalement utilisé est programmé pour se remettre au
travail sur sa tâche en cours, sinon ça n'a bien sûr aucun intérêt.
Quelquefois, le process est incapable de se remettre au travail
(ressource plantée ou autre). Dans ce cas, le Watchdog après 2
tentatives, décide de rebooter le système, ce qui suppose que lui-même
et le process sont inscrits dans la liste de démarrage, et qu'un
auto-logon est prévu.
Donc le Watchdog commence par envoyer une commande de reboot soft
(fermez-vous svp) afin de laisser une chance aux diverses applis de se
terminer proprement, et après un délai si ça échoue, il commande un
reboot forcé.
Mais ça ne suffit pas, quelquefois windows lui-même est dans un tel
état qu'il est incapable de rebooter (et en général à ce stade le
Watchdog est planté aussi).
Dans ce cas, la seule solution est un reboot hard, ce qui signifie que
je vais devoir coupler mon Watchdog logiciel avec un petit boîtier
électronique contenant un timer redéclenchable, auquel il envoie un
heart beat, et capable d'actionner le contact reset du PC. La
solution élégante est de faire une carte PCI (la revue Elektor a
publié tout ce qu'il faut pour l'interfaçage), la solution économique
est de monter ça sur un port série.

Qu'est-ce qu'il ne faut pas faire pour pouvoir compter sur un process
!



J'ose te demander quelle application est à la fois si laxiste qu'elle
peut supporte une panne momentané, si mal programmée qu'un plantage peut
toujours arriver et si nécessaire qu'un reboot peut être imaginé?

Perso, j'ai toujours préféré regardé pq ça plante et arranger cela (que
ce soit dans mon code ou pas) plutôt que d'appliquer le "ça plante, je
reboot", cher à certains mauvais admins...

Enfin bref, j'imagine que tu as réfléchi à tous cela et que ton contexte
s'y prête, mais ça m'intéresse, si tu pouvais m'en dire plus!

--
Quentin Pouplard (Tene/MyOE)
http://www.myoe.org | http://graff.alrj.org
Avatar
Patrick \Zener\ BRUNET
Bonjour.

"Quentin Pouplard" a écrit dans le message news:


J'ose te demander quelle application est à la fois si laxiste qu'elle
peut supporte une panne momentané, si mal programmée qu'un plantage peut
toujours arriver et si nécessaire qu'un reboot peut être imaginé?

Perso, j'ai toujours préféré regardé pq ça plante et arranger cela (que
ce soit dans mon code ou pas) plutôt que d'appliquer le "ça plante, je
reboot", cher à certains mauvais admins...

Enfin bref, j'imagine que tu as réfléchi à tous cela et que ton contexte
s'y prête, mais ça m'intéresse, si tu pouvais m'en dire plus!




Je fais en fait une dérivation ludique d'une projet plus sérieux pour lequel
j'avais la maîtrise du développement, pour le nouveau je ne l'ai pas au
niveau de l'appli de communication utilisée.

Pour le projet initial, il s'agissait d'un projet confidentiel, mais
globalement il s'agissait de gérer via un réseau et Internet des
transactions où des sommes d'argent importantes sont en jeu, et ceci de
manière autonome (personne devant le PC).

Le process peut supporter d'être interrompu quelques minutes, mais il est
hors de question de découvrir le soir à 19h00 qu'il est planté depuis 10h00
et que le client est ruiné depuis 11h00.

Pourquoi ça planterait alors ? Je te rassure, je fais du 0 error, 0 warning,
je traque toutes les allocations et libérations de ressources, et tous les
cas d'erreurs plausibles. Mais malheureusement on ne maîtrise pas tout dans
un logiciel, et notamment tout ce qui se passe au niveau des librairies,
drivers et autres.
Depuis que je fais de la comm réseau, j'ai pu constater que "des fois, il y
a des sockets qui sont perdus" ou divers gags dans le genre.
Idem pour les drivers. Par exemple, j'ai mon PC qui sporadiquement gèle
complètement en ouvrant une vidéo avec le MediaPlayer, alors que la même
vidéo passe sans problème une fois rebooté.
Donc même si on s'efforce de programmer proprement, il y a tellement d'aléas
et de couches dans le mille-feuilles qu'un plantage est toujours possible.

[1/2 HS] C'est vrai aussi pour Linux : il y a un moment sur le forum C++, on
avait parlé de l'implémentation de op new(), et je m'étonnais que le handler
doive normalement contenir un printf() + abort(). J'ai alors appris avec
horreur que le système ultra-fiable (du moins à l'époque ->) n'échouait
jamais lors d'un malloc() et que lorsqu'on voulait utiliser le pointeur, là
seulement il essayait de mettre de la RAM derrière, et s'il ne pouvait pas,
il passait en mode panique et tuait des processes jusqu'à retomber sur ses
pattes (j'espère que c'est fini cette histoire !).
Effectivement, je me souviens il y a 10 ans de collègues Unixiens (sur Sun)
qui en arrivant le matin disaient: "Oh, mon process est mort ! Pas grave, on
le relance..."[/HS]

Ceci est peut-être acceptable (????) pour une applette bureautique, mais
selon l'enjeu, il faut changer de stratégie. Excepté l'agent 007, on ne
meurt qu'une fois mais elle suffit. Quand c'est ta faute encore tu peux
assumer, mais si ça vient d'un autre, que ça se passe dans un driver ou
autre méandre sans aucune explication, que faire ? Débugger tout le système
?

Cordialement,

PZB
Avatar
Cyrille \cns\ Szymanski
> Pour le projet initial, il s'agissait d'un projet confidentiel, mais
globalement il s'agissait de gérer via un réseau et Internet des
transactions où des sommes d'argent importantes sont en jeu, et ceci
de manière autonome (personne devant le PC).

Le process peut supporter d'être interrompu quelques minutes, mais il
est hors de question de découvrir le soir à 19h00 qu'il est planté
depuis 10h00 et que le client est ruiné depuis 11h00.



C'est pour ça qu'en général il y a un gugus payé pour surveiller le parc de
machines et s'il n'est pas abilité a effectuer la maintenance lui-même,
dispose d'un téléphone.


Pourquoi ça planterait alors ? Je te rassure, je fais du 0 error, 0
warning, je traque toutes les allocations et libérations de
ressources, et tous les cas d'erreurs plausibles. Mais malheureusement
on ne maîtrise pas tout dans un logiciel, et notamment tout ce qui se
passe au niveau des librairies, drivers et autres.



Il y a aussi le mauvais emploi de pilotes/bibliothèques qui cause leur
disfonctionnement.


--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/
1 2