1

我最近在 after_restart 阶段添加了延迟作业说唱。像这样:

system "script/delayed_job stop"
system "script/delayed_job start -n 3"

这在大多数情况下都有效。直到我今天遇到了一个小问题。即使在我反复手动执行之后,我发现延迟作业的实例仍在运行script/delayed_job stop

我仍然得到这个:

user@ip-10-126-6-125 /data/HQ_Channel2/current $ ps aux | grep del
user   11034  0.0  3.4  74016 61964 ?        S    Dec05   0:19 delayed_job.0                     
user   11036  0.0  3.5  73660 63516 ?        S    Dec05   0:21 delayed_job.1                     
user   11038  0.0  3.6  73980 65256 ?        S    Dec05   0:17 delayed_job.2

我试图通过关闭它是不合适的script/delayed_job stop吗?

我知道如何杀死它的唯一其他方法是使用 a kill -9,但这不是矫枉过正吗?更重要的是,我将如何动态地实现它?

4

1 回答 1

1

我有一个类似的问题。

查看Engine Yard 的delayed_job recipe,特别是带有启动和停止命令的模板。/engineyard/bin/dj它在您的 Engine Yard 实例上使用脚本。

<% (@num_workers || 1).times do |num| %>
  check process <%= @worker_name %>_<%= num %>
    with pidfile /var/run/engineyard/dj/<%= @app_name %>/dj_<%= @worker_name %>.pid
    start program = "/engineyard/bin/dj <%= @app_name %> start <%= @framework_env %> <%= @worker_name %>" with timeout 60 seconds
    stop program = "/engineyard/bin/dj <%= @app_name %> stop <%= @framework_env %> <%= @worker_name %>" with timeout 60 seconds
    if totalmem is greater than 300 MB then restart # eating up memory?
    group dj_<%= @app_name %>
<% end %>

调用停止脚本时,它首先使用kill -15(TERM),等待默认为 60 秒的宽限期,如果它仍然存在,则使用kill -9.

如果可以在以后减少维护,请使用 Engine Yard 的脚本(和配方)。但如果它不适合您,您可以根据这些概念编写脚本。我在升级到 Rails 3 时遇到了一些问题,所以它可能适合你,也可能不适合你。我刚刚联系了Engine Yard,但我怀疑这对他们来说是一个高度优先事项。也许如果你也联系他们,那会改变。

于 2012-02-05T15:58:24.707 回答