如何在不使用`at_exit`的情况下确保在Rails退出之前运行一个操作?

时间:2014-12-23 19:36:35

标签: ruby-on-rails ruby

我有一个操作,我需要在我的Rails应用程序死之前在我的rails应用程序中执行。我可以在Rails中使用这个钩子吗?类似于at_exit的东西我估计。

2 个答案:

答案 0 :(得分:6)

Ruby本身支持两个钩子BEGINEND,它们在脚本开始时运行,并且解释器停止运行它。

参见" What does Ruby's BEGIN do?"了解更多信息。

BEGIN文档说:

  

通过代码块指定在程序的顺序执行开始之前无条件执行的代码。有时用于模拟对方法的前向引用。

puts times_3(gets.to_i)

BEGIN {
  def times_3(n)
    n * 3
  end
}

END文件说:

  

通过代码块指定在程序终止之前执行的代码。

END { puts "Bye!" }

答案 1 :(得分:3)

好的,所以我不保证影响,因为我根本没有测试过这个,但你可以定义自己的钩子,例如。

 ObjectSpace.define_finalizer(YOUR_RAILS_APP::Application, proc {puts "exiting now"})

请注意,这将在at_exit之后执行,因此rails应用程序服务器输出将类似于

Stopping ...
Exiting
exiting now

包括Tin Man的解决方案

 ObjectSpace.define_finalizer(YOUR_RAILS_APP::Application, proc {puts "exiting now"})
 END { puts "exiting again" } 

输出

 Stopping ...
 Exiting
 exiting again
 exiting now