How do I clear stuck/stale Resque workers?

后端 未结 15 725
你的背包
你的背包 2020-12-07 07:22

As you can see from the attached image, I\'ve got a couple of workers that seem to be stuck. Those processes shouldn\'t take longer than a couple of seconds.

相关标签:
15条回答
  • 2020-12-07 07:33

    You probably have the resque gem installed, so you can open the console and get current workers

    Resque.workers
    

    It returns a list of workers

    #=> [#<Worker infusion.local:40194-0:JAVA_DYNAMIC_QUEUES,index_migrator,converter,extractor>]
    

    pick the worker and prune_dead_workers, for example the first one

    Resque.workers.first.prune_dead_workers
    
    0 讨论(0)
  • 2020-12-07 07:37

    In your console:

    queue_name = "process_numbers"
    Resque.redis.del "queue:#{queue_name}"
    

    Otherwise you can try to fake them as being done to remove them, with:

    Resque::Worker.working.each {|w| w.done_working}
    

    EDIT

    A lot of people have been upvoting this answer and I feel that it's important that people try hagope's solution which unregisters workers off a queue, whereas the above code deletes queues. If you're happy to fake them, then cool.

    0 讨论(0)
  • 2020-12-07 07:37

    I had stuck/stale resque workers here too, or should I say 'jobs', because the worker is actually still there and running fine, it's the forked process that is stuck.

    I chose the brutal solution of killing the forked process "Processing" since more than 5min, via a bash script, then the worker just spawn the next in queue, and everything keeps on going

    have a look at my script here: https://gist.github.com/jobwat/5712437

    0 讨论(0)
  • 2020-12-07 07:39

    I just did:

    % rails c production
    irb(main):001:0>Resque.workers
    

    Got the list of workers.

    irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)
    

    ... where n is the zero based index of the unwanted worker.

    0 讨论(0)
  • 2020-12-07 07:41

    I've cleared them out from redis-cli directly. Luckily redistogo.com allows access from environments outside heroku. Get dead worker ID from the list. Mine was

    55ba6f3b-9287-4f81-987a-4e8ae7f51210:2
    

    Run this command in redis directly.

    del "resque:worker:55ba6f3b-9287-4f81-987a-4e8ae7f51210:2:*"
    

    You can monitor redis db to see what it's doing behind the scenes.

    redis xxx.redistogo.com> MONITOR
    OK
    1380274567.540613 "MONITOR"
    1380274568.345198 "incrby" "resque:stat:processed" "1"
    1380274568.346898 "incrby" "resque:stat:processed:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*" "1"
    1380274568.346920 "del" "resque:worker:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*"
    1380274568.348803 "smembers" "resque:queues"
    

    Second last line deletes the worker.

    0 讨论(0)
  • 2020-12-07 07:46

    Started working on https://github.com/shaiguitar/resque_stuck_queue/ recently. It's not a solution to how to fix stuck workers but it addresses the issue of resque hanging/being stuck, so I figured it could be helpful for people on this thread. From README:

    "If resque doesn't run jobs within a certain timeframe, it will trigger a pre-defined handler of your choice. You can use this to send an email, pager duty, add more resque workers, restart resque, send you a txt...whatever suits you."

    Been used in production and works pretty well for me thus far.

    0 讨论(0)
提交回复
热议问题