2011-09-14 3 views
108

Как видно из прилагаемого изображения, у меня есть пара рабочих, которые кажутся застрявшими. Эти процессы не должны занимать больше двух секунд.Как очистить застрявшие/устаревшие ресницы?

enter image description here

Я не знаю, почему они не разгуляешься или как вручную удалить их.

Я нахожусь на Heroku, используя Resque с Redis-to-Go и HireFire, чтобы автоматически масштабировать работников.

+2

Привет, вопрос, связанный с полуобеспечением: как вы получили панель инструментов resque-web через героку? Я не могу понять, как его открыть. –

ответ

200

Ни одно из этих решений не работал для меня, я бы до сих пор вижу это в Redis-сети:

0 out of 10 Workers Working 

Наконец, это работает для меня, чтобы очистить все рабочие:

Resque.workers.each {|w| w.unregister_worker} 
+11

Это сработало для меня. Это незарегистрированные * все * рабочие, которые были немного раздражающими. Но это сопровождалось «перезапуском герою», похоже, это трюк. Сейчас это показывает правильное количество рабочих. –

+0

Это сработало и для меня! –

+0

Это отобрало рабочих из веб-интерфейса, но на самом деле они все еще отображаются как процессы, а также «украли» задания из очереди. – txwikinger

25

Вы, вероятно, установлен спасательный камень, так что вы можете открыть консоль и получить текущую рабочие

Resque.workers 

возвращает список рабочего

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

выбрать работник и prune_dead_workers, например, первая

Resque.workers.first.prune_dead_workers 
+0

Собственно, с другой стороны, это ничего не делало. – Shpigford

+2

Это отлично подходит для расчистки рабочих, которые были убиты без регистрации. –

+3

Это похоже на новый лучший ответ, поскольку он не отменяет регистрацию всех из них. Должен ли prune_dead_workers быть метод класса? Но в любом случае, отличное решение! Благодарю. –

8

Запускайте эту команду, где бы вы ни управляли co mmand запустить сервер

$ ps -e -o pid,command | grep [r]esque 

вы должны увидеть что-то вроде этого:

92102 resque: Processing ProcessNumbers since 1253142769 

Обратите внимание на PID (идентификатор процесса) в моем примере это

Тогда вы можете выйти из процесса 1 из 2 способов.

  • Изящно использовать QUIT 92102

  • Принудительно использовать TERM 92102

* Я не уверен синтаксиса это либо QUIT 92102 или QUIT -92102

Позвольте мне знать, если вы есть любые проблемы.

+3

В консоли Linux: kill -SIGQUIT 92102 – Alexey

45

В консоли:

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

В противном случае вы можете попытаться подделать их, как делается, чтобы удалить их с:

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

EDIT

много людей имеют были направлены на этот ответ, и я чувствую, что важно, чтобы люди пытались решить проблему хагеапа, которая откладывает работу рабочих от очереди, тогда как вышеупомянутый код del etes queues. Если вы счастливы подделать их, тогда остыньте.

+3

Если он это сделает, он удалит всю очередь, он просто хочет удалить застрявшую некоторые .. – jBeas

+1

Небольшое обновление: теперь вы должны использовать Resque.redis.del вместо Resque.redis.delete –

+1

Теперь есть метод Resque.remove_queue() – iainbeeston

2

я имел аналогичная проблема, что Redis сохранил БД на диск, который включал недопустимых (не работающих) рабочих. Каждый раз, когда был запущен Redis/resque, они появились.

Fix это с помощью:

Resque::Worker.working.each {|w| w.done_working} 
Resque.redis.save # Save the DB to disk without ANY workers 

Убедитесь, что вы перезапустите Redis и ваши Resque рабочих.

+0

Это был единственный способ, с помощью которого я мог прояснить ситуацию. Спасибо – simonmorley

0

Я тоже застрял/затмел рабочих, чтобы не было проблем, или я должен сказать «рабочие места», потому что рабочий на самом деле все еще там и работает нормально, это заторможенный процесс.

Я выбрал жестокое решение убить раздвоенный процесс «обработки», так как более чем за 5 минут, через Баш скрипт, то работник просто икру следующий в очереди, и все продолжает идти

посмотреть на мой сценарий здесь: https://gist.github.com/jobwat/5712437

6

Я только что сделал:

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

Есть список работников.

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

... где n - нулевой индекс нежелательного работника.

0

Я очистил их от redis-cli напрямую. К счастью redistogo.com позволяет получить доступ из окружения вне героку. Получите идентификатор мертвого работника из списка. Шахта была

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

Запустить эту команду непосредственно в redis.

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

Вы можете контролировать redis db, чтобы увидеть, что он делает за кулисами.

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" 

Вторая последняя строка удаляет работника.

+0

Неплохая идея. Это не будет вызывать отменить регистрацию перехватов в Resque, не вызывая сбоя и возможного удаления кода, который может иметь пользователь. – Jeremy

+0

Это было полезно с resque 2 года назад, когда он показывал застрявшие задания, которые невозможно было удалить с помощью интерфейса, и не было никакого чистого способа сделать это в rails –

1

В последнее время началась работа над https://github.com/shaiguitar/resque_stuck_queue/. Это не решение, как исправить застрявших работников, но оно решает проблему зависания/зависания, поэтому я решил, что это может быть полезно для людей в этой теме. Из README:

«Если resque не запускает заданий в течение определенного периода времени, он будет вызывать предопределенный обработчик по вашему выбору. Вы можете использовать это для отправки электронной почты, работы пейджера, добавления новых работников resque, перезагрузки resque, отправьте вам txt ... все, что вам подходит ».

Используется в производстве и работает для меня до сих пор.

22

Добавляя к ответу hagope, я хотел иметь возможность только отменить регистрацию рабочих, которые работали в течение определенного времени. Приведенный ниже код будет только отменить регистрацию рабочих, работающих более 300 секунд (5 минут).

Resque.workers.each {|w| w.unregister_worker if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 300} 

У меня есть постоянный сбор связанных с Rake задач Resque, которые я добавил к этому: https://gist.github.com/ewherrmann/8809350

+3

Очки за то, что вы показываете, как получить доступ к началу работы с помощью обработки ['run_at «]. Я видел другие решения, которые используют метод .started, но на самом деле это возвращает время, в которое * рабочий * был запущен, а не работа, что является неправильным подходом для очистки застрявших работников. Благодаря! –

2

Вот как вы можете очистить их от Redis по имени хоста. Это случается со мной, когда я выводя из эксплуатации сервер, а работники не выходят изящно.

Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) } 
0

Если вы используете новые версии Resque, вам необходимо использовать следующую команду как внутренние интерфейсы изменились ...

Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)} 
0

Это позволяет избежать проблем до тех пор, пока у вас есть спасательная версия новее, чем 1.26.0:

resque: env QUEUE=foo TERM_CHILD=1 bundle exec rake resque:work 

Имейте в виде, что не позволяет в данный момент работаю закончить работу.

2

Я столкнулся с этой проблемой и начал путь реализации множества предложений здесь. Тем не менее, я обнаружил первопричину, которая создавала эту проблему: я был using the gem redis-rb 3.3.0. Переход к redis-rb 3.2.2 помешал этим работникам застревать в первую очередь.

Смежные вопросы