40 votes

Générer un processus d'arrière-plan dans Ruby

Je suis en train d'écrire un rubis d'amorçage de script pour un projet d'école, et une partie de ce processus d'amorçage est de commencer un couple de processus d'arrière-plan (qui sont écrits et de fonctionner correctement). Ce que j'aime faire, c'est quelque chose le long des lignes de:

`/path/to/daemon1 &`
`/path/to/daemon2 &`
`/path/to/daemon3 &`

Cependant, qui bloque sur le premier appel pour exécuter daemon1. J'ai vu des références à un Process.spawn méthode, mais qui semble être de 1,9+ fonctionnalité, et je suis limité à Ruby 1.8.

J'ai aussi essayé d'exécuter ces démons de threads différents, mais j'aimerais que mon script bootstrap pour être en mesure de sortir.

Alors, comment puis-je commencer ces processus d'arrière-plan de sorte que mon script bootstrap ne bloque pas et peuvent quitter (mais encore les démons cours d'exécution en arrière-plan)?

Merci!

67voto

Marcel Jackwerth Points 20632

Tant que vous travaillez sur un OS POSIX, vous pouvez utiliser fork et exec .

fork = Créer un sous-processus

exec = Remplacer le processus actuel par un autre processus

Vous devez ensuite informer que votre processus principal n'est pas intéressé par les sous-processus créés via Process.detach .

 job1 = fork do
  exec "/path/to/daemon01"
end

Process.detach(job1)

...
 

0voto

ThorX89 Points 967

Vous devriez être en mesure de le faire:

  system "/path/to/daemon &"

Avec cela, quand le shell est engendrée par le système a terminé (dans ce cas, effectivement et immédiatement, car il n'a rien d'autre à faire que de l'exécution de la tâche en arrière-plan), les travaux en arrière-plan devient à nouveau apparentés à l' PPID=1.

Backticks, %x{}, et la famille de bloc parce qu'ils tentent de capturer la sortie de l'arrière-plan de commande (et ils ne sont pas de réception EOF aussi longtemps que le processus d'arrière-plan est en cours d'exécution avec son STDOUT ouvert).

system ne pas attendre pour le STDOUT de le processus de l'enfant, il récupère uniquement le statut de sortie de la coquille qu'elle engendre et qui convertit le statut soit d' true (si 0) ou false.

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