45 votes

Comment puis-je vérifier auprès de Ruby si un processus avec un certain pid est en cours d'exécution?

S'il y a plus d'une façon, veuillez les énumérer. Je ne connais que l'un d'entre eux, mais je me demande s'il existe une méthode plus propre, à la manière de Ruby.

59voto

tonystubblebine Points 331

La différence entre les approches Process.getpgid et Process::kill semble correspondre à ce qui se produit lorsque le pid existe mais appartient à un autre utilisateur. Process.getpgid retournera une réponse, Process::kill lève une exception (Errno::EPERM) .

Sur cette base, je recommande Process.getpgid , ne serait-ce que parce que cela vous évite d'avoir à intercepter deux exceptions différentes.

Voici le code que j'utilise:

 begin
  Process.getpgid( pid )
  true
rescue Errno::ESRCH
  false
end
 

47voto

Pistos Points 8997

@ John T, @Dustin: En fait, les gars, j'ai parcouru les processus du processus, et on dirait

 Process.getpgid( pid )
 

est un moyen moins violent d'appliquer la même technique.

47voto

Dustin Points 35205

S'il s'agit d'un processus que vous vous attendez à "posséder" (par exemple, vous l'utilisez pour valider un pid pour un processus que vous contrôlez), vous pouvez simplement lui envoyer le signal 0.

 >> Process.kill 0, 370
=> 1
>> Process.kill 0, 2
Errno::ESRCH: No such process
    from (irb):5:in `kill'
    from (irb):5
>>
 

27voto

balu Points 1960

Pour les processus enfants, d'autres solutions comme l'envoi d'un signal ne se comporte pas comme prévu: ils indiquent que le processus est toujours en cours d'exécution quand il fait de la fermeture.

Vous pouvez utiliser des Processus.waitpid si vous voulez vérifier sur un processus que vous avez donné naissance à soi-même. L'appel ne sera pas bloquer si vous êtes à l'aide de l' Process::WNOHANG le drapeau et l' nil va être retourné aussi longtemps que le processus de l'enfant n'a pas de sortie.

Exemple:

pid = spawn('sleep 5')
Process.waitpid(pid, Process::WNOHANG) # => nil
sleep 5
Process.waitpid(pid, Process::WNOHANG) # => pid

Si le pid n'appartient pas à un processus enfant, une exception sera levée (Errno::ECHILD: No child processes).

La même chose s'applique aux Processus.waitpid2.

4voto

John T Points 14067

Vous pouvez essayer d'utiliser

 Process::kill 0, pid
 

où pid est le nombre pid. Si le pid est en cours d'exécution, il doit renvoyer 1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X