Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

3 réponses
Avatar
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!

3 réponses

Avatar
espie
In article <gins45$26b2$,
Guillaume GOURDIN wrote:
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);
Avatar
Nicolas George
Marc Espie wrote in message <gintpk$26fl$:
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.
Avatar
Paul Gaborit
À (at) 22 Dec 2008 12:51:41 GMT,
Nicolas George <nicolas$ écrivait (wrote):
Marc Espie wrote in message <gintpk$26fl$:
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>