在我的Rails应用程序中,我有一个脚本可以更新数据库中的某些记录.当我发送SIGTERM来杀死脚本时,它偶尔会在ActiveRecord执行查询时收到该信号.这会导致引发ActiveRecord :: StatementInvalid异常.
我想捕获当它们是SIGTERM的结果并退出脚本时发生的StatementInvalid异常.如何判断StatementInvalid是否因为信号而发生而不是出于其他原因?
如果您捕获TERM信号,我相信您将避免异常.您可以在脚本的开头执行此操作(或者在任何地方执行此操作,但您只需执行一次).
Signal.trap("TERM") do Kernel.exit! end
您收到StatementInvalid错误的原因是Ruby通过在当前执行的位置引发SIGTERM异常来处理信号.ActiveRecord正在捕获异常并将其重新抛出为StatementInvalid.通过设置Signal处理程序,Ruby将执行您的处理程序而不是引发异常.
有关更多信息,请参阅Ruby Signal文档.