Quiero escribir un programa de Ruby que siempre se ejecutará en segundo plano (un daemon) en mi Mac.¿Hace un programa de Ruby un daemon?
¿Puede alguien señalarme en la dirección correcta sobre cómo se haría esto?
Quiero escribir un programa de Ruby que siempre se ejecutará en segundo plano (un daemon) en mi Mac.¿Hace un programa de Ruby un daemon?
¿Puede alguien señalarme en la dirección correcta sobre cómo se haría esto?
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
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
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. :-) –
@Kaelin, excelente punto. Debería haber leído la pregunta con más cuidado. Lamentablemente, no hago nada acerca de las Mac ... – Mark
gran explicación. – zee
Ah, Google al rescate! Salida
http://fitzgeraldsteele.wordpress.com/2009/05/04/launchd-example-start-web-server-at-boot-time/
en el que un blogger útiles proporciona un ejemplo de escritura de un plist launchd para poner en marcha un servidor de aplicaciones Web rubí.
¡Me alegra que pensaras que fue útil! Personalmente, me ha gustado el lanzamiento ... por ejemplo, puede reiniciar el proceso si se apaga inesperadamente. – fitzgeraldsteele
Rubí ha 1.9.x ahora lo siguiente:
Process.daemon
Ponlo en tu código y listo.
Tomado de "Daemon Processes in Ruby."
No funciona en Windows. – Olathe
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:
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
Es una joya. Usted simplemente instala y comienza a usarlo. – zengr
Ok muchas gracias. – agentbanks217