2010-09-10 17 views

Respuesta

17

Uso Daemonize.rb

require 'daemons' 
Daemons.daemonize 

muestra muy simple: http://github.com/utkarsh2012/backitup/blob/master/backitup.rb

Como instalar demonios joya:

gem install daemons 
+0

Esto podría ser una pregunta estúpida, pero ¿dónde está el archivo daemonize.rb? ¿Es una joya, hay un lugar en la web donde puedo encontrarla, es la biblioteca estándar, o qué? – agentbanks217

+0

Es una joya. Usted simplemente instala y comienza a usarlo. – zengr

+0

Ok muchas gracias. – agentbanks217

3

Esto es module para demonizar su código. Aquí hay un offshoot que envuelve un script existente.

Esencialmente se reduce a lo siguiente (de Daemonize.rb de Travis Whitton, el primer enlace de arriba, modificado por algún programa que escribió hace años):

private 
# This method causes the current running process to become a daemon 
# If closefd is true, all existing file descriptors are closed 
def daemonize(pathStdErr, oldmode=0, closefd=false) 
    srand # Split rand streams between spawning and daemonized process 
    safefork and exit# Fork and exit from the parent 

    # Detach from the controlling terminal 
    unless sess_id = Process.setsid 
     raise 'Cannot detach from controlled terminal' 
    end 

    # Prevent the possibility of acquiring a controlling terminal 
    if oldmode.zero? 
     trap 'SIGHUP', 'IGNORE' 
     exit if pid = safefork 
    end 

    Dir.chdir "/" # Release old working directory 
    File.umask 0000 # Insure sensible umask 

    if closefd 
     # Make sure all file descriptors are closed 
     ObjectSpace.each_object(IO) do |io| 
      unless [STDIN, STDOUT, STDERR].include?(io) 
       io.close rescue nil 
      end 
     end 
    end 

    STDIN.reopen "/dev/null"  # Free file descriptors and 
    STDOUT.reopen "/dev/null" # point them somewhere sensible 
    STDERR.reopen pathStdErr, "w"   # STDOUT/STDERR should go to a logfile 
    return oldmode ? sess_id : 0 # Return value is mostly irrelevant 
end 

# Try to fork if at all possible retrying every 5 sec if the 
# maximum process limit for the system has been reached 
def safefork 
    tryagain = true 
    while tryagain 
     tryagain = false 
     begin 
      if pid = fork 
       return pid 
      end 
     rescue Errno::EWOULDBLOCK 
      sleep 5 
      tryagain = true 
     end 
    end 
end 
+0

Marcos, mientras que esta es la razón código para más sistemas Unix vainilla, y funcionará más o menos en Mac OS X, realmente no es la receta correcta ... No tengo una receta enlatada útil para registrar un script de ruby ​​con launchd, pero eso es lo que el OP probablemente debería estar buscando. :-) –

+0

@Kaelin, excelente punto. Debería haber leído la pregunta con más cuidado. Lamentablemente, no hago nada acerca de las Mac ... – Mark

+0

gran explicación. – zee

27

Rubí ha 1.9.x ahora lo siguiente:

Process.daemon 

Ponlo en tu código y listo.

Tomado de "Daemon Processes in Ruby."

+1

No funciona en Windows. – Olathe

3

que ver el demonios de carriles joya para Rails 3 (basado en la rails_generator):

https://github.com/mirasrael/daemons-rails

posible generar código auxiliar demonio de la siguiente manera:

rails generate daemon <name> 

Características:

  • estafa individual guión trol por daemon
  • rastrillo: comando demonio por daemon
  • Capistrano amigable
  • en toda la aplicación script de control
  • supervisión de la API
  • posible demonio de varios conjuntos de