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!
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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);
In article <gins45$26b2$1@biggoron.nerim.net>,
Guillaume GOURDIN <trash@hotmail.com> 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!
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);
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.
Marc Espie wrote in message <gintpk$26fl$2@biggoron.nerim.net>:
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.
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
À (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/>
À (at) 22 Dec 2008 12:51:41 GMT,
Nicolas George <nicolas$george@salle-s.org> écrivait (wrote):
Marc Espie wrote in message <gintpk$26fl$2@biggoron.nerim.net>:
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/>
À (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/>