Ok I’ve put together a couple of scripts that are basically a hodgepodge
of daemonize, mongrel, and aaf code that start and stop ferret_server.
The start script looks for the pid_file value in ferret_server.yml, then
creates a pid file in config based on that value, forks, end exits.
The stop script looks for the pid_file in the same place and sends the
TERM signal. Upon receiving the TERM signal, script that launched
ferret_server removes the pid file and exits.
Here is the start script:
#!/usr/bin/env script/runner
config =
YAML.load(ERB.new(IO.read(“#{RAILS_ROOT}/config/ferret_server.yml”)).result)[RAILS_ENV]
@pid_file = “#{RAILS_ROOT}/#{config[‘pid_file’]}”
def write_pid_file
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
write_pid_file
at_exit do
File.unlink(@pid_file) if @pid_file and File.exists?(@pid_file)
end
puts “Starting ferret_server…”
trap(“TERM”) { exit(0) }
sess_id = Process.setsid
STDIN.reopen “/dev/null” # Free file descriptors and
STDOUT.reopen “/dev/null”, “a” # point them somewhere sensible
STDERR.reopen STDOUT # STDOUT/STDERR should go to a logfile
ActsAsFerret::Remote::Server.start
DRb.thread.join
Here is the Stop Script:
#!/usr/bin/env script/runner
config =
YAML.load(ERB.new(IO.read(“#{RAILS_ROOT}/config/ferret_server.yml”)).result)[RAILS_ENV]
def send_signal(signal, pid_file)
pid = open(pid_file).read.to_i
print “Sending #{signal} to ferret_server at PID #{pid}…”
begin
Process.kill(signal, pid)
rescue Errno::ESRCH
puts “Process does not exist. Not running.”
end
puts “Done.”
end
pid_file = config[‘pid_file’]
puts “Stopping ferret_server…”
send_signal(“TERM”, pid_file)
Haven’t really tested them very much but they seem to be working.
Jens K. wrote:
Hi!
On Mon, Mar 05, 2007 at 05:25:50PM +0100, Adam T. wrote:
patch.
I could imagine a set of start/stop scripts where the start script
launched the server as a daemon and recorded it’s pid somewhere. stop
the only had to read that pid and kill the process. Those scripts could
then be easily be called from cap recipes.
Something like Daemonize (http://grub.ath.cx/daemonize/) might come in
handy.
I’d really appreciate if you could tackle that subject
cheers,
Jens
–
Jens Kr�mer
webit! Gesellschaft f�r neue Medien mbH
Schnorrstra�e 76 | 01069 Dresden
Telefon +49 351 46766-0 | Telefax +49 351 46766-66
[email protected] | www.webit.de
Amtsgericht Dresden | HRB 15422
GF Sven Haubold, Hagen Malessa