检查延迟的作业是不是在rails中运行

Posted

技术标签:

【中文标题】检查延迟的作业是不是在rails中运行【英文标题】:Check whether the delayed job is running in rails检查延迟的作业是否在rails中运行 【发布时间】:2013-01-30 00:16:18 【问题描述】:

我正在设计一个状态页面,我需要在其中显示延迟的作业是否正在运行。请帮助我在代码中找到它。

我正在使用 导轨 3.0.20, ruby 1.8.7 (2011-06-30 补丁级别 352), 和 延迟作业 3.0.4

【问题讨论】:

【参考方案1】:

使用 Rails 5.x,您可以通过 ssh 进入您的服务器并进入您应用中的 /current 文件夹并运行:

RAILS_ENV=production bin/delayed_job status

【讨论】:

在我的 Rails 4 项目中,命令是 RAILS_ENV=production script/delayed_job status @bayfieldcoder 您是否从 rails 3 升级了该项目? 是的,我确实从 rails 3 升级了它。【参考方案2】:

你可以使用

RAILS_ENV=production script/delayed_job status 

如果您在生产模式下检查

【讨论】:

【参考方案3】:

检查delayed_job 是否正在运行的最简单方法是检查locked_by 字段。

此字段将包含工作人员或进程锁定/处理作业。

如果有作业正在运行,运行 Delayed::Job.where('locked_by is not null') 会给你一些结果。

除此之外,您可以让发条任务执行此查询,以检查状态。

希望这会有所帮助。

【讨论】:

【参考方案4】:

目前,我能想到的确保delayed_job daemon 始终运行的最佳方法是将initializer 添加到我们的Rails 应用程序中,以检查守护程序是否正在运行。如果它没有运行,那么initializer 将启动daemon,否则就让它继续运行。

因此,现在的问题是,我们如何检测到 Delayed_Job daemon 正在从脚本内部运行?

简单的方法-

检查守护进程PID file (File.exist? ...) 是否存在。如果它在那里,则假设它正在运行,否则启动它。

【讨论】:

我正在使用 DJ(活动记录)在 EC2 上工作。我正在使用“mina”进行部署。如何在启动之前检查 DJ 是否正在运行。问题是每当我部署时都会启动多个 DJ 进程。 如何在脚本中启动worker? script/delayed_job 重启会起作用吗?【参考方案5】:

要检查作业状态等,您可以使用delayed_job_web gem,它会列出所有排队的作业。并确保其始终运行安装 monit。 Here's railscast。 Here's 更多关于如何为delayed_job 配置monit 的信息

【讨论】:

【参考方案6】:
#!/usr/bin/env ruby

pid = ARGV[0].to_i

begin
  Process.kill(0, pid)
  puts "#pid is running"
rescue Errno::EPERM                     # changed uid
  puts "No permission to query #pid!";
rescue Errno::ESRCH
  puts "#pid is NOT running.";      # or zombied
rescue
  puts "Unable to determine status for #pid : #$!"
end

查看How can I determine if a different process id is running using Java or JRuby on Linux?

【讨论】:

以上是关于检查延迟的作业是不是在rails中运行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中使用延迟作业取消预定作业?

在其他方法完成后运行方法延迟作业 rails 3

Rails 3 延迟作业 - 升级到 Rails 3 会中断延迟作业任务

销毁 Rails 中所有延迟的工作

Rails:延迟作业-> 发送异步邮件时未接收“来自”字段

免费在 Heroku 上运行延迟作业