2010-03-23 31 views
37

Estoy escribiendo un script de arranque de ruby ​​para un proyecto escolar, y parte de este proceso de arranque es para iniciar un par de procesos en segundo plano (que están escritos y funcionan correctamente). Lo que me gustaría hacer es algo similar a:engendrar un proceso de fondo en Ruby

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

Sin embargo, eso bloquea en la primera llamada para ejecutar daemon1. He visto referencias a un método Process.spawn, pero eso parece ser una característica de 1.9+, y estoy limitado a Ruby 1.8.

También he intentado ejecutar estos demonios a partir de diferentes hilos, pero me gustaría que mi script de arranque pueda salir.

Entonces, ¿cómo puedo iniciar estos procesos en segundo plano para que mi script de arranque no se bloquee y pueda salir (pero aún tenga los daemons ejecutándose en segundo plano)?

Respuesta

63

Mientras trabaje en un sistema operativo POSIX puede usar fork y exec.

fork = Crear un subproceso

exec = Reemplazar proceso actual con otro proceso

A continuación, deberá informar de que su proceso principal no está interesado en los subprocesos creados a través de Process.detach.

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

Process.detach(job1) 

... 
+0

Si está buscando algo más grande (pero aún en el mismo host), considere daemon_controller. http://blog.phusion.nl/2008/08/25/daemon_controller-a-library-for-robust-daemon-management/ – Levi

+1

¡Perfecto! Sabía sobre 'fork' y' exec' (viniendo de un fondo C), pero era el 'Process.detach()' que me faltaba. ¡Gracias! –

+0

Esto no funciona como esperaba, para mí, en OSX Lion y el ruby ​​preinstalado. – nes1983

0

Bueno, técnicamente hablando, puede, literalmente:

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

Pero eso no va a hacer lo que usted quiere que haga, obviamente.

Sin embargo, usted puede también simplemente pasar & como argumento para system (y amigos), y va a fondo el trabajo.

0

mejor manera a pseudo-deamonize:

`((/path/to/deamon1 &)&)` 

se reducirá el proceso en su propio shell.

mejor manera de realidad daemonize:

`service daemon1 start` 

y asegúrese de que el servidor/usuario tiene permiso para iniciar el demonio real. echa un vistazo a la herramienta 'deamonize' para Linux para configurar tu deamon.

Cuestiones relacionadas