2011-02-07 22 views
8

¿Cómo iniciaría un daemon de shell y luego lo detendré desde el mismo script de Ruby?Cómo iniciar y detener un daemon de shell desde Ruby

Para ser más específicos, me gustaría que mi script Ruby a:

  • iniciar un demonio del servidor con un comando shell (rails server | shotgun | etc ...).
  • hacer un par de cosas mientras el servidor se está ejecutando.
  • hacen que el servidor se cierre.

Se prefieren todas las soluciones abarcadoras que se admiten en ruby ​​1.8/1.9 y Unix/Windows. (Leo fork, por ejemplo, no funciona en Windows).

+0

No estoy seguro de que su suposición de que Kernel :: fork no funcione en Windows sea correcta. Pasaría algún tiempo experimentando con Kernel :: exec, Kernel :: fork, Kernel :: system y vería cómo se comportan para usted. –

+0

Jordan, no uso Windows. Acabo de tropezar con varias menciones de fork no comportarse como se esperaba en Windows (como aquí: http://www.ruby-forum.com/topic/215939). –

Respuesta

3

Puedo recomendar el Ruby Daemons gem. Creo que tiene toda la funcionalidad que necesita.

Compruebe la sección 3 de su archivo README, y preste especial atención al método Daemons.call que permite demonizar el código arbitrario (en el cual podría simplemente una aplicación Kernel.system).

+0

@Pavel: erm, sí, sección 3 de los documentos: "Controla un grupo de daemons de otra aplicación" ... Sí, en parte es para demonizar, ¡pero también para demonizar otras aplicaciones! – Peter

0

Aquí hay problema similar con una solución que utiliza la línea de comandos de Windows de trabajo:

https://serverfault.com/questions/35305/cmd-exe-how-to-starts-a-background-process-run-some-things-stops-background-pr

Esto es bastante sucio, pero no el truco.

Utilice Linux si puede, o simplemente bash con herramientas de línea de comandos básicas (instaladas con Git para Windows). Con bash, la solución es muy simple:

./script/rails server --pid server.pid & 
ruby do_your_stuff.rb 
kill `cat server.pid` 

P.S. Windows no es el entorno recomendado para Rails de todos modos. Probablemente ahorrará mucho tiempo en el largo plazo al cambiar a Linux, ya que no resolverá problemas ambientales como este.

0

no podía encontrar la manera de hacer lo que sea necesario con la gema de rubíes Demonios Peter sugirió, y terminó usando systemu lugar:

# command to start daemon 
command = "thin start" # here starting thin server as example 
status, stdout, stderr = systemu command do |cid| 
    # do stuff here 
    # ... 

    Process.kill 9, cid # kill the daemon 
end 
+0

Para usar la gema Daemons con Rails, debe usar el complemento daemon_generator. http://douglasfshearer.com/blog/cron-jobs-in-ruby-on-rails –

+0

Gracias, pero no estoy usando Rails. –

Cuestiones relacionadas