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.
Réponses
Trop de publicités? 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
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
>>
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.