I'd like to have some cleanup code开发者_JS百科 run when Rails is shutting down - is that possible? My situation is that I have a few threads in the background (I'm using jruby and calling into java) that live for the life of the process and I need to let them know to shut themselves down
Thanks!
Probably should just use the Ruby exit handler, which is a Kernel method:
$ irb
>> at_exit do
?> puts 'bye...'
>> end
=> #<Proc:0xb79a87e4@(irb):1>
>> exit
bye...
$
Within the context of a Rails Application, the best place to put such a file is in config/initializers
. In my app, I needed to Flush the Redis/Sidekiq queue whenever the development or test environments shut down. This works perfectly.
config/initializers/at_exit.rb
at_exit do
begin
puts 'Flushing Redis...'
Redis.new.flushall
rescue => e
puts "There was an #{e.to_s} while flushing redis..."
ensure
puts 'Done Flushing Redis!'
end
end unless Rails.env.production?
Be aware that you must not use Signal.trap
because it does redefine what was set. There is a trick to call previous trap:
$prev_trap = Signal.trap("TERM") do
$prev_trap&.call
graceful_shutdown
end
However Rails initializators are executed before app server starts, e.g. Puma redefines most of the signal traps throwing away what was defined. Therefore do not use this, it might work maybe for webrick but not in production environmentální.
So the only reasonable option is what was already recommended by folks: at_exit
in an initializer.
精彩评论