开发者

How do I stop delayed_job if I'm running it with the -m "monitor" option?

How do I stop delayed_job if I'm running it with the -m "monitor" option? The processes keep getting restarted!

The command I start delayed_job with is:

script/delayed_job -n 4 -m start

The -m runs a monitor processes that spawns a new delayed_job process if one dies.

The command I'm using to stop is:

script/delayed_job stop

B开发者_如何转开发ut that doesn't stop the monitor processes, which in turn start up all the processes again. I would just like them to go away. I can kill them, which I have, but I was hoping there was some command line option to just shut the whole thing down.


In my capistrano deploy script I have this:

desc "Start workers"
task :start_workers do
  run "cd #{release_path} && RAILS_ENV=production script/delayed_job -m -n 2 start"
end

desc "Stop workers"
task :stop_workers do
  run "ps xu | grep delayed_job | grep monitor | grep -v grep | awk '{print $2}' | xargs -r kill"
  run "cd #{current_path} && RAILS_ENV=production script/delayed_job stop"
end

To avoid any errors that may stop your deployment script:

  • "ps xu" only show processes owned by the current user
  • "xargs -r kill" only invoke the kill command when there is something to kill

I only kill the delayed_job monitor, and stop the delayed_job deamon the normal way.


I had this same problem. Here's how I solved it:

# ps -ef | grep delay
root      8605     1  0 Jan03 ?        00:00:00 delayed_job_monitor                               
root     15704     1  0 14:29 ?        00:00:00 dashboard/delayed_job                             
root     15817 12026  0 14:31 pts/0    00:00:00 grep --color=auto delay

Here you see the delayed_job process and the monitor. Next, I would manually kill these processes and then delete the PIDs. From the application's directory (/usr/share/puppet-dashboard in my case):

# ps -ef | grep delay | grep -v grep | awk '{print $2}' | xargs kill && rm tmp/pids/*


The direct answer is that you have to kill the monitor process first. However AFAIK there isn't an easy way to do this, I don't think the monitor PIDs are stored anywhere and the DJ start and stop script certainly doesn't do anything intelligent there, as you noticed.

I find it odd that the monitor feature was included -- I guess Daemons has it so whomever was writing the DJ script figured they would just pass that option down. But it's not really usable as it is.

I wrote an email to the list about this a while back, didn't get an answer: https://groups.google.com/d/msg/delayed_job/HerSuU97BOc/n4Ps430AI1UJ

You can see more about monitoring with Daemons here: http://daemons.rubyforge.org/classes/Daemons.html#M000004

If you come up with a better answer/solution, add it to the wiki here: https://github.com/collectiveidea/delayed_job/wiki/monitor-process


if you can access server, you can try these commands:

ps -ef | grep delayed_job
kill -9 XXXX #xxxx is process id

OR

cd path-to-app-folder/current
RAILS_ENV=production bin/delay_job stop
RAILS_ENV=production bin/delay_job start

You can also add this script to capistrano3 in config/deploy.rb

namespace :jobworker do
 task :start do
    on roles(:all) do
      within "#{current_path}" do
        with rails_env: "#{fetch(:stage)}" do
          execute "bin/delayed_job start"
        end
      end
    end
  end
 task :stop do
    on roles(:all) do
      within "#{current_path}" do
        with rails_env: "#{fetch(:stage)}" do
          execute "bin/delayed_job stop"
        end
      end
    end
  end
end

then run cap

cap production jobworker:stop
cap production jobworker:start
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜