Vérifier qu'un processus est un train de tourner

Le
Guillaume GOURDIN
Bonjour à tous, je voudrais vérifier qu'un processus dont je connais je
PID est en train de tourner, et ce de manière non bloquante. Quelle est
la façon de procéder? Merci pour votre aide!
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #18200591
In article Guillaume GOURDIN
Bonjour à tous, je voudrais vérifier qu'un processus dont je connais je
PID est en train de tourner, et ce de manière non bloquante. Quelle est
la façon de procéder? Merci pour votre aide!




use POSIX;

waitpid($pid, POSIX::WNOHANG);
Nicolas George
Le #18201331
Marc Espie wrote in message
Bonjour à tous, je voudrais vérifier qu'un processus dont je connais je
PID est en train de tourner, et ce de manière non bloquante. Quelle est
la façon de procéder? Merci pour votre aide!


waitpid($pid, POSIX::WNOHANG);



Seulement si on en est le père, et dans ce cas ça ne sert à rien de tester :
on reçoit un SIGCHLD pour prévenir, et on récupère le PID dans si_pid si on
veut.

Pour tester un processus sans lien de parenté, c'est kill($pid, 0), à
condition d'en avoir les droits. Mais cette méthode n'est pas fiable : même
si le processus est mort, rien n'empêche qu'un autre processus ait récupéré
son PID plus tard.

La méthode correcte ici, c'est de tester si le service que le processus est
censé fournir est effectivement fourni. Par exemple, si c'est un serveur
HTTP, faire une requête légère.
Paul Gaborit
Le #18201651
À (at) 22 Dec 2008 12:51:41 GMT,
Nicolas George
Marc Espie wrote in message
Bonjour à tous, je voudrais vérifier qu'un processus dont je connais je
PID est en train de tourner, et ce de manière non bloquante. Quelle est
la façon de procéder? Merci pour votre aide!


waitpid($pid, POSIX::WNOHANG);



Seulement si on en est le père, et dans ce cas ça ne sert à rien de tester :
on reçoit un SIGCHLD pour prévenir, et on récupère le PID dans si_pid si on
veut.



Oui. Sauf que la récupération et le traitement du SIGCHLD en Perl est
lourde et, selon les versions, plus ou moins fiable (en plus, cela
peut avoir des effets indésirables - cf. perlvar). Personnellement, je
préfère ne pas gérer les signaux SIGCHLD et passer par des appels
explicite à waitpid bloquants ou non (sur les plateformes qui le
permettent).

Pour tester un processus sans lien de parenté, c'est kill($pid, 0), à
condition d'en avoir les droits. Mais cette méthode n'est pas fiable : même
si le processus est mort, rien n'empêche qu'un autre processus ait récupéré
son PID plus tard.



En fait, au-delà des droits, ce n'est pas le 'kill' qui n'est pas
fiable, c'est le moyen de récupérer le PID *du* fameux processus. Il y
a évidemment un problème d'atomicité des actions (je récupère le PID
puis j'en fais quelque chose mais le processus a évolué entre
temps)...

Dans les trucs idiots, on peut aussi faire appel à 'ps' pour voir les
processus qui tournent...

La méthode correcte ici, c'est de tester si le service que le processus est
censé fournir est effectivement fourni. Par exemple, si c'est un serveur
HTTP, faire une requête légère.



C'est effectivement beaucoup plus fiable pour un serveur web ou autre
service (car on peut imaginer que le processus existe encore mais
qu'il n'assure plus le service...).

En fait, comme d'habitude, la vraie question est : pourquoi vouloir
vérifier qu'un processus tourne ? Selon la réponse, cela permettra de
choisir le meilleur moyen de faire.

--
Paul Gaborit - Perl en français -
Publicité
Poster une réponse
Anonyme