Wie Sie dem beigefügten Bild entnehmen können, habe ich ein paar Arbeiter, die festzustecken scheinen. Diese Prozesse sollten nicht länger als ein paar Sekunden dauern.
Ich bin nicht sicher, warum sie nicht gelöscht werden oder wie sie manuell entfernt werden können.
Ich bin auf Heroku und verwende Resque mit Redis-to-Go und HireFire, um Arbeiter automatisch zu skalieren.
ruby-on-rails
ruby-on-rails-3
heroku
redis
resque
Shpigford
quelle
quelle
Antworten:
Keine dieser Lösungen hat bei mir funktioniert, ich würde dies immer noch in redis-web sehen:
Schließlich funktionierte dies für mich, um alle Arbeiter zu klären:
quelle
heroku restart
schien den Trick zu tun. Es zeigt jetzt die richtige Anzahl von Arbeitern.Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
nur die Worker abmelden möchten, die keine tatsächlichen Prozesse sind (und möglicherweise Jobs verarbeiten), möchten Sie möglicherweise versuchen, die Registrierung der Worker aufzuheben, deren Pids nicht Teil der bekannten laufenden Pids sind. Ich weiß nicht, ob dies in allen Umgebungen funktioniert, aber es funktioniert gut auf Ubuntu. Dies funktioniert möglicherweise nur, wenn sich Ihre Mitarbeiter auf demselben Computer befinden, auf dem Sie diesen Code ausführen.unregister_worker
? Gibt es eine Möglichkeit, dies festzustellen?In Ihrer Konsole:
Andernfalls können Sie versuchen, sie zu fälschen, um sie zu entfernen, mit:
BEARBEITEN
Viele Leute haben diese Antwort positiv bewertet, und ich halte es für wichtig, dass die Leute die Lösung von hagope ausprobieren, mit der die Registrierung von Mitarbeitern aus einer Warteschlange aufgehoben wird, während der obige Code Warteschlangen löscht. Wenn Sie glücklich sind, sie zu fälschen, dann cool.
quelle
Wahrscheinlich haben Sie das Resque-Juwel installiert, sodass Sie die Konsole öffnen und aktuelle Mitarbeiter abrufen können
Es gibt eine Liste der Arbeiter zurück
Wählen Sie den Arbeiter und
prune_dead_workers
zum Beispiel den erstenquelle
Zusätzlich zur Antwort von Hagope wollte ich in der Lage sein, nur die Registrierung von Arbeitnehmern aufzuheben, die eine bestimmte Zeit lang gearbeitet hatten. Mit dem folgenden Code werden nur Mitarbeiter abgemeldet, die länger als 300 Sekunden (5 Minuten) arbeiten.
Ich habe eine fortlaufende Sammlung von Rake-Aufgaben im Zusammenhang mit Resque, die ich auch hinzugefügt habe: https://gist.github.com/ewherrmann/8809350
quelle
Führen Sie diesen Befehl überall dort aus, wo Sie den Befehl zum Starten des Servers ausgeführt haben
Sie sollten so etwas sehen:
Notieren Sie sich die PID (Prozess-ID) in meinem Beispiel 92102
Dann können Sie den Prozess auf zwei Arten beenden.
Anmutig verwenden
QUIT 92102
Mit Gewalt verwenden
TERM 92102
* Ich bin mir nicht sicher, welche Syntax es ist
QUIT 92102
oderQUIT -92102
Lassen Sie mich wissen, wenn Sie Probleme haben.
quelle
Ich habe gerade getan:
Habe die Liste der Arbeiter.
... wobei n der auf Null basierende Index des unerwünschten Arbeiters ist.
quelle
Ich hatte ein ähnliches Problem, dass Redis die Datenbank auf einer Festplatte speicherte, die ungültige (nicht laufende) Worker enthielt. Jedes Mal, wenn Redis / resque gestartet wurde, erschienen sie.
Beheben Sie dies mit:
Stellen Sie sicher, dass Sie Redis und Ihre Resque-Mitarbeiter neu starten.
quelle
Hier erfahren Sie, wie Sie sie anhand des Hostnamens aus Redis entfernen können. Dies passiert mir, wenn ich einen Server außer Betrieb nehme und die Mitarbeiter nicht ordnungsgemäß beendet werden.
quelle
Ich bin auf dieses Problem gestoßen und habe mich auf den Weg gemacht, viele der Vorschläge hier umzusetzen. Ich entdeckte jedoch, dass die Hauptursache für dieses Problem darin bestand, dass ich den Edelstein redis-rb 3.3.0 verwendete . Ein Downgrade auf redis-rb 3.2.2 verhinderte, dass diese Arbeiter überhaupt stecken blieben.
quelle
Begann vor kurzem mit der Arbeit an https://github.com/shaiguitar/resque_stuck_queue/ . Es ist keine Lösung, um festsitzende Arbeiter zu reparieren, aber es befasst sich mit dem Problem des Aufhängens / Feststeckens von Resque. Ich dachte, es könnte für Leute in diesem Thread hilfreich sein. Aus der README:
"Wenn resque keine Jobs innerhalb eines bestimmten Zeitraums ausführt, wird ein vordefinierter Handler Ihrer Wahl ausgelöst. Sie können damit eine E-Mail senden, Pager-Aufgaben ausführen, weitere Resque-Mitarbeiter hinzufügen, resque neu starten und Ihnen einen Text senden. ..was immer dir passt."
Wurde in der Produktion verwendet und funktioniert bisher ziemlich gut für mich.
quelle
Ich hatte auch hier festgefahrene Arbeiter, oder sollte ich 'Jobs' sagen, weil der Arbeiter tatsächlich noch da ist und gut läuft, ist es der gegabelte Prozess, der feststeckt.
Ich entschied mich für die brutale Lösung, den gegabelten Prozess "Processing" seit mehr als 5 Minuten über ein Bash-Skript zu beenden, dann spawnte der Worker einfach den nächsten in der Warteschlange und alles geht weiter
Schauen Sie sich mein Skript hier an: https://gist.github.com/jobwat/5712437
quelle
Ich habe sie direkt aus Redis-Cli entfernt. Glücklicherweise ermöglicht redistogo.com den Zugriff von Umgebungen außerhalb von Heroku. Holen Sie sich die ID des toten Arbeiters aus der Liste. Meins war
Führen Sie diesen Befehl direkt in redis aus.
Sie können redis db überwachen, um zu sehen, was es hinter den Kulissen tut.
Die vorletzte Zeile löscht den Arbeiter.
quelle
Wenn Sie neuere Versionen von Resque verwenden, müssen Sie den folgenden Befehl verwenden, da sich die internen APIs geändert haben ...
quelle
Dies vermeidet das Problem, solange Sie eine neuere Version als 1.26.0 haben:
Beachten Sie, dass der aktuell ausgeführte Job nicht beendet wird.
quelle
Sie können auch den folgenden Befehl verwenden, um alle
rescue
Worker zu stoppenReferenz von diesem Link
quelle