discourse/config/initializers/watch_for_restart.rb

31 lines
963 B
Ruby
Raw Normal View History

2013-02-25 11:42:20 -05:00
# this is a trivial graceful restart on touch of tmp/restart.
#
# It simply drains all the requests (waits up to 4 seconds) and issues a HUP
# if you need a more sophisticated cycling restart for multiple thins it will need to be written
#
# This works fine for Discourse.org cause we host our app accross multiple machines, if you hosting
# on a single machine you have a trickier problem at hand as you need to cycle the processes in order
2013-02-25 11:42:20 -05:00
Thread.new do
2013-02-05 14:16:51 -05:00
file = "#{Rails.root}/tmp/restart"
old_time = File.ctime(file).to_i if File.exists? file
wait_seconds = 4
2013-02-05 14:16:51 -05:00
return if $PROGRAM_NAME !~ /thin/
2013-02-25 11:42:20 -05:00
2013-02-05 14:16:51 -05:00
while true
time = File.ctime(file).to_i if File.exists? file
2013-02-05 14:16:51 -05:00
if old_time != time
Rails.logger.info "attempting to reload #{$$} #{$PROGRAM_NAME} in #{wait_seconds} seconds"
2013-02-05 14:16:51 -05:00
$shutdown = true
sleep wait_seconds
2013-02-25 11:42:20 -05:00
Rails.logger.info "restarting #{$$}"
Process.kill("HUP", $$)
return
2013-02-05 14:16:51 -05:00
end
sleep 1
2013-02-05 14:16:51 -05:00
end
end