我想编写一个Ruby程序,它将一直在我的Mac后台运行(也就是一个守护进程)。
有没有人可以指导我如何做到这一点?
require 'daemons'
Daemons.daemonize
一个非常简单的示例:http://github.com/utkarsh2012/backitup/blob/master/backitup.rb
如何安装daemons gem:
gem install daemons
啊,谷歌来救场!查看
http://fitzgeraldsteele.wordpress.com/2009/05/04/launchd-example-start-web-server-at-boot-time/
这里有一个乐于助人的博主提供了编写launchd plist文件以启动Ruby网站应用服务器的示例。
需要查看针对Rails 3的daemons-rails gem(基于rails_generator):
https://github.com/mirasrael/daemons-rails
可以像这样生成daemon stub:
rails generate daemon <name>
特性:
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