Jak widać na załączonym obrazku, mam kilku pracowników, którzy wydają się utknąć. Te procesy nie powinny trwać dłużej niż kilka sekund.
Nie jestem pewien, dlaczego nie wyczyszczą się ani jak ręcznie je usunąć.
Jestem na Heroku i używam Resque z Redis-to-Go i HireFire do automatycznego skalowania pracowników.
ruby-on-rails
ruby-on-rails-3
heroku
redis
resque
Shpigford
źródło
źródło
Odpowiedzi:
Żadne z tych rozwiązań nie zadziałało, nadal widzę to w redis-web:
Wreszcie pomogło mi to usunąć wszystkich pracowników:
źródło
heroku restart
zdawało się działać. Teraz pokazuje prawidłową liczbę pracowników.Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
wyrejestrować tylko tych pracowników, których numery identyfikacyjne nie są częścią znanych działających pidów. Nie wiem, czy to działa w każdym środowisku, ale działa dobrze na ubuntu. Może to działać tylko wtedy, gdy pracownicy są na tym samym komputerze, na którym uruchamiasz ten kod.unregister_worker
? Czy istnieje sposób, aby to ustalić?W Twojej konsoli:
W przeciwnym razie możesz spróbować udawać, że są zrobione, aby je usunąć, za pomocą:
EDYTOWAĆ
Wiele osób zagłosowało za tą odpowiedzią i uważam, że ważne jest, aby ludzie wypróbowali rozwiązanie Hagope, które wyrejestrowuje pracowników z kolejki, podczas gdy powyższy kod usuwa kolejki. Jeśli z przyjemnością je udajesz, spoko.
źródło
Prawdopodobnie masz zainstalowany klejnot resque, więc możesz otworzyć konsolę i zdobyć obecnych pracowników
Zwraca listę pracowników
wybierz pracownika i
prune_dead_workers
np. pierwszegoźródło
Dodając odpowiedź przez wiedźmę, chciałem móc wyrejestrować tylko pracowników, którzy pracowali przez określony czas. Poniższy kod wyrejestruje tylko pracowników działających przez ponad 300 sekund (5 minut).
Mam ciągłą kolekcję zadań Rake związanych z Resque, do których również dodałem: https://gist.github.com/ewherrmann/8809350
źródło
Uruchom to polecenie w każdym miejscu, w którym zostało uruchomione polecenie uruchomienia serwera
powinieneś zobaczyć coś takiego:
Zanotuj PID (identyfikator procesu) w moim przykładzie jest to 92102
Następnie możesz zakończyć proces 1 z 2 sposobów.
Używaj z wdziękiem
QUIT 92102
Użyj siły
TERM 92102
* Nie jestem pewien składni, to albo
QUIT 92102
alboQUIT -92102
Daj mi znać, jeśli masz jakieś problemy.
źródło
Właśnie zrobiłem:
Mam listę pracowników.
... gdzie n jest indeksem niechcianego pracownika liczonym od zera.
źródło
Miałem podobny problem, że Redis zapisał bazę danych na dysku zawierającą nieprawidłowych (niedziałających) pracowników. Za każdym razem, gdy uruchamiano Redis / resque, pojawiały się.
Napraw to za pomocą:
Upewnij się, że ponownie uruchomiłeś Redis i swoich pracowników Resque.
źródło
Oto, jak możesz usunąć je z Redis za pomocą nazwy hosta. Dzieje się tak, gdy wyłączam serwer, a pracownicy nie wychodzą z wdziękiem.
źródło
Natknąłem się na ten problem i zacząłem podążać ścieżką wdrożenia wielu sugestii tutaj. Jednak odkryłem, że główną przyczyną powodującą ten problem było to, że korzystałem z gem redis-rb 3.3.0 . Obniżenie poziomu do redis-rb 3.2.2 zapobiegło przede wszystkim utknięciu tych pracowników.
źródło
Niedawno rozpocząłem pracę nad https://github.com/shaiguitar/resque_stuck_queue/ . To nie jest rozwiązanie, jak naprawić zablokowanych pracowników, ale rozwiązuje problem ponownego zawieszania się / utknięcia, więc pomyślałem, że może to być pomocne dla osób w tym wątku. Z README:
„Jeśli resque nie uruchamia zadań w określonym przedziale czasowym, uruchomi wstępnie zdefiniowany program obsługi, który wybierzesz. Możesz użyć tego do wysłania wiadomości e-mail, obowiązku pagera, dodania większej liczby pracowników, ponownego uruchomienia ponownego utworzenia, wysłania SMS-a. .. cokolwiek ci odpowiada. "
Był używany w produkcji i do tej pory działa całkiem dobrze.
źródło
Miałem tu również utkniętych / nieaktualnych pracowników resque, a może powinienem powiedzieć „praca”, ponieważ pracownik nadal tam jest i działa dobrze, to rozwidlony proces utknął.
Wybrałem brutalne rozwiązanie polegające na zabijaniu rozwidlonego procesu „Przetwarzanie” od ponad 5 minut za pomocą skryptu bash, a następnie pracownik po prostu spawnuje następnego w kolejce i wszystko idzie dalej
spójrz na mój skrypt tutaj: https://gist.github.com/jobwat/5712437
źródło
Usunąłem je bezpośrednio z redis-cli. Na szczęście redistogo.com umożliwia dostęp ze środowisk spoza heroku. Uzyskaj identyfikator martwego pracownika z listy. Moje było
Uruchom to polecenie bezpośrednio w Redis.
Możesz monitorować redis db, aby zobaczyć, co robi za kulisami.
Druga ostatnia linia usuwa pracownika.
źródło
Jeśli używasz nowszych wersji Resque, musisz użyć następującego polecenia, ponieważ wewnętrzne interfejsy API uległy zmianie ...
źródło
Pozwala to uniknąć problemu, o ile masz wersję resque nowszą niż 1.26.0:
Należy pamiętać, że nie pozwala to na zakończenie aktualnie wykonywanego zadania.
źródło
możesz również użyć poniższego polecenia, aby zatrzymać wszystkich
rescue
pracownikówodniesienie z tego linku
źródło