Я хочу написать программу Ruby, которая всегда будет работать в фоновом режиме (демона) на моем Mac.
Может ли кто-нибудь указать мне в правильном направлении, как это будет сделано?
Я хочу написать программу Ruby, которая всегда будет работать в фоновом режиме (демона) на моем Mac.
Может ли кто-нибудь указать мне в правильном направлении, как это будет сделано?
Использовать Daemonize.rb
require 'daemons'
Daemons.daemonize
Очень простой пример: http://github.com/utkarsh2012/backitup/blob/master/backitup.rb
Как установить демоны gem:
gem install daemons
Теперь Ruby 1.9.x имеет следующие значения:
Process.daemon
Поместите его в свой код и его.
Взято из Процессы Daemon в Ruby.
Ах, Google на помощь! Проверьте
http://fitzgeraldsteele.wordpress.com/2009/05/04/launchd-example-start-web-server-at-boot-time/
в котором полезный блоггер представляет собой пример написания плагина запуска для запуска сервера веб-приложений Ruby.
Это модуль для демонтирования вашего кода. Здесь ответвление, которое обертывает существующий script.
По сути, это сводится к этому (от Travis Whitton Daemonize.rb, первая ссылка выше, измененная для некоторой программы, которую я написал много лет назад):
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
Вам нужно увидеть драгоценный камень демонов для Rails 3 (на основе rails_generator):
https://github.com/mirasrael/daemons-rails
Возможно создание демона-заглушки следующим образом:
rails generate daemon <name>
Особенности: