Jak usunąć zablokowanych / czerstwych pracowników Resque?

Jak widać na załączonym obrazku, Mam kilku pracowników, którzy chyba utknęli. Procesy te nie powinny trwać dłużej niż kilka sekund.

Tutaj wpisz opis obrazka

Nie jestem pewien, dlaczego nie chcą wyczyścić lub jak ręcznie je usunąć.

Jestem na Heroku używając Resque z Redis-To-Go i HireFire do automatycznego skalowania pracowników.

Author: Shpigford, 0000-00-00

15 answers

Żadne z tych rozwiązań nie zadziałało dla mnie, i tak widzę to w redis-web:

0 out of 10 Workers Working
W końcu udało mi się oczyścić wszystkich pracowników:]}
Resque.workers.each {|w| w.unregister_worker}
 208
Author: hagope,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-16 21:51:25

W konsoli:

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

W przeciwnym razie możesz spróbować sfałszować je jako zrobione, aby je usunąć, z:

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

EDIT

Wiele osób głosowało za tą odpowiedzią i uważam, że ważne jest, aby ludzie spróbowali rozwiązania hagope, które usuwa pracowników z kolejki, podczas gdy powyższy kod usuwa kolejki. Jeśli chętnie je podrabiasz, to spoko.

 48
Author: Simpleton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-19 08:16:16

Prawdopodobnie masz zainstalowany Resque gem, więc możesz otworzyć konsolę i pobrać aktualnych pracowników

Resque.workers

Zwraca listę pracowników

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

Wybierz pracownika i prune_dead_workers, na przykład pierwszy

Resque.workers.first.prune_dead_workers
 27
Author: Shairon Toledo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-22 12:41:29

Dodając do odpowiedzi hagope, chciałem być w stanie tylko wyrejestrować pracowników, którzy pracowali przez pewien czas. Poniższy kod spowoduje wyrejestrowanie tylko pracowników pracujących przez ponad 300 sekund (5 minut).

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

Mam na bieżąco zbiór zadań związanych z Resque, do których również dodałem to: https://gist.github.com/ewherrmann/8809350

 24
Author: ewH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 18:29:06

Uruchom to polecenie gdziekolwiek uruchomiłeś polecenie do uruchomienia serwera

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

Powinieneś zobaczyć coś takiego:

92102 resque: Processing ProcessNumbers since 1253142769

Zanotuj PID (ID procesu) w moim przykładzie jest to 92102

Następnie możesz zamknąć proces na 1 z 2 sposobów.

  • Gracefully use QUIT 92102

  • / align = "left" / TERM 92102

* nie jestem pewien składni to albo QUIT 92102 albo QUIT -92102

Daj znać, jeśli masz jakieś kłopoty.

 8
Author: jBeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-27 19:41:40

Właśnie zrobiłem:

% rails c production
irb(main):001:0>Resque.workers
Mam listę pracowników.
irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)

... gdzie n jest indeksem zerowym niechcianego pracownika.

 6
Author: user2811637,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 14:47:38

MiaĹ 'em podobny problem, Ĺźe Redis zapisaĺ' DB na dysku zawierajÄ ... cym nieprawidĺ ' owe (nie pracujÄ ... ce) workery. Po każdym uruchomieniu Redis/resque pojawiali się.

Napraw to używając:

Resque::Worker.working.each {|w| w.done_working}
Resque.redis.save # Save the DB to disk without ANY workers
Upewnij się, że ponownie uruchomiłeś Redis i swoich pracowników Resque.
 2
Author: joost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-15 11:39:59

Oto jak można je usunąć z Redis przez nazwę hosta. Zdarza mi się to, gdy wyłączam serwer, a pracownicy nie opuszczają go z wdziękiem.

Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }
 2
Author: Rich Sutton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 01:49:13

Natknąłem się na ten problem i zacząłem ścieżkę wdrażania wielu sugestii tutaj. Jednak odkryłem, że główną przyczyną powstania tego problemu było to, że byłem za pomocą gem redis-RB 3.3.0. Przejście na redis-rb 3.2.2 uniemożliwiło tym pracownikom utknięcie w pierwszej kolejności.

 2
Author: Will Bryant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 21:08:57

Rozpoczął pracę nad https://github.com/shaiguitar/resque_stuck_queue / Ostatnio. Nie jest to rozwiązanie, jak naprawić zablokowanych pracowników, ale rozwiązuje problem resque wiszące / utknięcie, więc pomyślałem, że może to być pomocne dla ludzi w tym wątku. Z README:

" jeśli resque nie uruchomi zadań w określonym czasie, uruchomi wstępnie zdefiniowaną obsługę wybraną przez Ciebie. Możesz użyć tego, aby wysłać e-mail, Pager obowiązek, dodać więcej pracowników resque, restart resque, wysłać Ci txt...cokolwiek ci pasuje."

Zostały wykorzystane w produkcji i działa całkiem dobrze dla mnie do tej pory.

 1
Author: Shai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 23:17:29

Ja też tu utknąłem / czerstwych pracowników resque, a może powinienem powiedzieć "praca", ponieważ pracownik nadal tam jest i działa dobrze, to rozwidlony proces się utknął.

Wybrałem brutalne rozwiązanie zabijania rozwidlonego procesu "przetwarzanie", ponieważ ponad 5min, za pomocą skryptu bash, potem worker po prostu odtwarza następny w kolejce i wszystko idzie dalej

Spójrz na mój skrypt tutaj: https://gist.github.com/jobwat/5712437

 0
Author: jobwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-06 05:55:01

Usunąłem ich z redis-cli. Na szczęście redistogo.com umożliwia dostęp ze środowisk spoza heroku. Zdobądź identyfikator martwego pracownika z listy. Mój był

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

Uruchom tę komendę bezpośrednio w redis.

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

Możesz monitorować redis db, aby zobaczyć, co robi za kulisami.

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"

Druga ostatnia linia usuwa pracownika.

 0
Author: Andrei R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 09:50:26

Jeśli używasz nowszych wersji Resque, musisz użyć następującego polecenia, ponieważ wewnętrzne interfejsy API uległy zmianie...

Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)}
 0
Author: lloydpick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 16:48:20

To pozwala uniknąć problemu, o ile masz wersję resque nowszą niż 1.26.0:

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

Należy pamiętać, że nie pozwala to zakończyć aktualnie wykonywanego zadania.

 0
Author: Joakim Kolsjö,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-05 14:23:19

Możesz również użyć poniższego polecenia, aby zatrzymać wszystkie rescue worker

sudo kill -9  `ps aux | grep resque | grep -v grep | cut -c 10-16`

Odniesienie z tego linku

 0
Author: uzaif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 11:16:02