是否可以在运行rake时处理SignalException:SIGHUP

时间:2016-10-18 18:26:52

标签: ruby-on-rails ruby heroku exception-handling rake

我在rails中有一个后台作业进行一些处理,如果该作业(rake任务)进程由于此异常而终止,因为SignalException:SIGHUP,我想发送一封电子邮件,以便我们可以重新启动rake。

是否有可能从这个例外中解救,虽然我的处理无论如何都会终止,但至少如果我可以在终止之前发送电子邮件。

请帮忙。

示例代码:

task :generate_best_bets_for_all_users do
  begin
    // do some processing
    // if something is wrong 
  rescue SignalException => e
    // OK? to rescue this exception?, is this possible? I want to send email here
  rescue StandardError => e
    // notify for other failures
  end
end

PS:这个过程在heroku上运行一个独立的dyno,比如 - heroku run:detached rake-name --app = app-name

2 个答案:

答案 0 :(得分:1)

您始终可以使用Signal.trap来抓住内容:

Signal.trap('HUP') do
  send_panic_email!
end

在拯救信号时尽量不要做太费劲的事情,你可以做的事情有限制,如果违反这些限制你可能会遇到错误。我认为限制取决于信号和操作系统。

答案 1 :(得分:0)

根据您的需求,使用Sidekiq之类的方法可能会更好。您的val params = RequestParams() params.put("userid", prefs!!.getLong("userid", 0)) params.put("nickname", prefs!!.getString("nickname", "")) params.put("file", finalInputSteam) 任务可能会产生一个作业,如果服务器被杀死,Sidekiq将自动将该作业推回到队列中。如果需要定期执行某项工作,则可以使用Heroku scheduler自动触发任务。听起来这是一项长期运行的工作,因此,在这种情况下,调度程序应触发单独的后台作业,这一点很重要,否则它可能会得到killed the next schedule interval