ferret_start 1.78 KB
#!/usr/bin/env ruby
# Ferret DRb server launcher script
#
# Place doc/ferret_server.yml into RAILS_ROOT/config and fit to taste. Start
# it with RAILS_ENV set to the desired environment.
#
#
# To run the demo project's unit tests against the drb server, start it with
# 
# RAILS_ENV=test script/ferret_start 
#
# and run your tests with the AAF_REMOTE environment variable set to a 
# non-empty value:
#
# AAF_REMOTE=true rake
#
# The server writes a log file in log/ferret_server.log, it's 
# STDOUT gets redirected to log/ferret_server.out

ENV['FERRET_USE_LOCAL_INDEX'] = 'true'
require File.dirname(__FILE__) + '/../config/boot'
require RAILS_ROOT + '/config/environment'


config = ActsAsFerret::Remote::Config.load
@pid_file = config['pid_file']

def write_pid_file
  raise "No PID file defined" if @pid_file.blank?
  open(@pid_file,"w") {|f| f.write(Process.pid) }
end

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

safefork and exit
at_exit do
  File.unlink(@pid_file) if @pid_file && File.exists?(@pid_file) && File.read(@pid_file).to_i == Process.pid
end
print "Starting ferret DRb server..."
trap("TERM") { exit(0) }
sess_id = Process.setsid


begin
  ActsAsFerret::Remote::Server.start
  write_pid_file
  puts "Done."
  STDIN.reopen "/dev/null"                                 # Free file descriptors and
  STDOUT.reopen "#{RAILS_ROOT}/log/ferret_server.out", "a" # point them somewhere sensible
  STDERR.reopen STDOUT                                     # STDOUT/STDERR should go to a logfile
rescue
  $stderr.puts "Error starting ferret DRb server: #{$!}"
  $stderr.puts $!.backtrace
  exit(1)
end
DRb.thread.join

# vim:set filetype=ruby: