我想编写一个Ruby程序,它将始终在Mac上的后台运行(守护进程)。
有人能指出我如何做到这一点的正确方向吗?
答案 0 :(得分:27)
答案 1 :(得分:18)
使用Daemonize.rb
require 'daemons'
Daemons.daemonize
非常简单的样本:http://github.com/utkarsh2012/backitup/blob/master/backitup.rb
如何安装守护进程gem:
gem install daemons
答案 2 :(得分:4)
http://fitzgeraldsteele.wordpress.com/2009/05/04/launchd-example-start-web-server-at-boot-time/
其中一位有用的博主提供了一个编写launchd plist以启动ruby Web应用程序服务器的示例。
答案 3 :(得分:3)
这是一个用于守护代码的module。这是包装现有脚本的offshoot。
基本上它归结为此(来自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
答案 4 :(得分:3)
需要查看Rails 3的 daemons-rails gem(基于rails_generator):
https://github.com/mirasrael/daemons-rails
可以像这样生成守护进程存根:
rails generate daemon <name>
特点: