web-dev-qa-db-fra.com

Comment puis-je effacer les travailleurs coincés / périmés Resque?

Comme vous pouvez le voir sur l'image ci-jointe, j'ai quelques travailleurs qui semblent être bloqués. Ces processus ne devraient pas prendre plus de deux secondes.

enter image description here

Je ne sais pas pourquoi ils ne vont pas effacer ou comment les supprimer manuellement.

Je suis sur Heroku en utilisant Resque avec Redis-to-Go et HireFire pour adapter automatiquement les travailleurs.

131
Shpigford

Aucune de ces solutions ne fonctionnait pour moi, je verrais toujours cela dans le redis-web:

0 out of 10 Workers Working

Enfin, cela a fonctionné pour moi pour effacer tous les travailleurs:

Resque.workers.each {|w| w.unregister_worker}
213
hagope

Dans votre console:

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

Sinon, vous pouvez essayer de les simuler comme étant en train de les supprimer, avec:

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

EDIT

Beaucoup de gens ont voté en faveur de cette réponse et j'estime qu'il est important d'essayer la solution de hagope qui désenregistre les travailleurs d'une file d'attente, alors que le code ci-dessus supprime les files d'attente. Si vous êtes content de les simuler, alors cool.

49
Simpleton

Vous avez probablement le resque gem installé, vous pouvez donc ouvrir la console et obtenir les travailleurs actuels

Resque.workers

Il retourne une liste de travailleurs

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

choisissez le travailleur et Prune_dead_workers, par exemple le premier

Resque.workers.first.Prune_dead_workers
28
Shairon Toledo

Ajoutant à répondre par hagope, je voulais être en mesure de ne pas enregistrer les travailleurs qui avaient fonctionné pendant un certain temps. Le code ci-dessous ne désinscrira que les travailleurs en cours d'exécution pendant plus de 300 secondes (5 minutes).

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

J'ai une collection en cours de tâches liées à Rake liées à Resque auxquelles j'ai également ajouté ceci: https://Gist.github.com/ewherrmann/880935

24
ewH

Exécutez cette commande partout où vous avez exécuté la commande pour démarrer le serveur.

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

vous devriez voir quelque chose comme ça:

92102 resque: Processing ProcessNumbers since 1253142769

Notez le PID (id de processus) dans mon exemple, il s’agit de 92102

Ensuite, vous pouvez quitter le processus de 1 à 2 manières.

  • Utiliser gracieusement QUIT 92102

  • Utiliser avec force TERM 92102

* Je ne suis pas sûr de la syntaxe, c'est soit QUIT 92102 ou QUIT -92102

Faites-moi savoir si vous avez des problèmes.

9
jBeas

Je viens de faire:

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

J'ai la liste des ouvriers.

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

... où n est l'index de base zéro du travailleur indésirable.

6
user2811637

J'ai rencontré ce problème et commencé à mettre en œuvre un grand nombre des suggestions présentées ici. Cependant, j'ai découvert que la cause principale de ce problème était que j'étais en utilisant la gem redis-rb 3.3. . Le déclassement en redis-rb 3.2.2 a empêché ces travailleurs de rester bloqués au départ.

2
Will Bryant

J'ai eu un problème similaire: Redis a sauvegardé la base de données sur un disque incluant des travailleurs non valides (non exécutés). Chaque fois que Redis/resque a été démarré, ils sont apparus.

Corrigez ceci en utilisant:

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

Assurez-vous de redémarrer Redis et vos employés Resque.

2
joost

Voici comment vous pouvez les purger de Redis par nom d’hôte. Cela m’arrive lorsque je mets un serveur hors service et que les travailleurs ne sortent pas normalement.

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

J'ai commencé à travailler sur https://github.com/shaiguitar/resque_stuck_queue/ récemment. Ce n'est pas une solution pour résoudre le problème des travailleurs bloqués, mais cela résout le problème de la suspension du blocage/du blocage, alors j'ai pensé que cela pourrait être utile aux personnes sur ce sujet. De README:

"Si resque n'exécute pas les travaux dans un délai déterminé, un gestionnaire prédéfini de votre choix sera déclenché. Vous pouvez l'utiliser pour envoyer un courrier électronique, un devoir de pageur, ajouter davantage de travailleurs de resque, redémarrer resque, vous envoyer un txt. ..qui vous convient. "

A été utilisé dans la production et fonctionne assez bien pour moi jusqu'à présent.

1
Shai

Je les ai éliminés directement de redis-cli. Heureusement, redistogo.com autorise l'accès depuis des environnements extérieurs à heroku. Obtenez l'ID de travailleur mort de la liste. Le mien était

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

Exécutez cette commande directement dans redis.

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

Vous pouvez surveiller redis db pour voir ce qu’il fait en coulisse.

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"

La deuxième dernière ligne supprime le travailleur.

0
Andrei R

Cela évite le problème tant que vous avez une version de resque plus récente que la 1.26.0:

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

Gardez à l'esprit que cela ne laisse pas le travail en cours se terminer.

0
Joakim Kolsjö

Si vous utilisez des versions plus récentes de Resque, vous devez utiliser la commande suivante car les API internes ont changé ...

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

vous pouvez également utiliser la commande ci-dessous pour arrêter tous les rescue worker

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

référence de ce lien

0
uzaif

J'avais aussi des travailleurs bloqués/obsolètes ici, ou devrais-je dire "emplois", parce que le travailleur est toujours là et fonctionne bien, c'est le processus à la fourchette qui est bloqué.

J'ai choisi la solution brutale consistant à supprimer le processus "Traitement" en différé depuis plus de 5 minutes, via un script bash, puis le travailleur génère le suivant dans la file d'attente et tout continue.

regardez mon script ici: https://Gist.github.com/jobwat/5712437

0
jobwat