Comment effacer les travailleurs Resque bloqués / périmés?

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

entrer la description de l'image ici

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

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

Aucune de ces solutions n’a fonctionné pour moi, je le verrais toujours dans 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} 

Dans votre console:

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

Sinon, vous pouvez essayer de les faire semblant de les supprimer, avec:

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

MODIFIER

Beaucoup de gens ont voté cette réponse et je pense qu’il est important que les gens essaient la solution de hagope qui désinsère les travailleurs d’une queue, alors que le code ci-dessus supprime les files d’attente. Si vous êtes heureux de les simuler, alors cool.

Vous avez probablement la gem resque installée, de sorte que vous pouvez ouvrir la console et obtenir des travailleurs actuels

 Resque.workers 

Il retourne une liste de travailleurs

 #=> [#] 

choisissez le travailleur et prune_dead_workers , par exemple le premier

 Resque.workers.first.prune_dead_workers 

En ajoutant à répondre par hagope, je voulais être capable de désinscrire uniquement les travailleurs qui avaient fonctionné pendant un certain temps. Le code ci-dessous ne enregistrera 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 continue de tâches de rake liées à Resque que j’ai également ajouté à ceci: https://gist.github.com/ewherrmann/8809350

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 ceci:

 92102 resque: Processing ProcessNumbers since 1253142769 

Notez le PID (id processus) dans mon exemple, il est 92102

Ensuite, vous pouvez quitter le processus de 1 à 2 façons.

  • Utilisez gracieusement QUIT 92102

  • Utilisez avec TERM 92102

* Je ne suis pas sûr de la syntaxe QUIT 92102 ou QUIT -92102

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

Je viens de faire:

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

J’ai la liste des travailleurs.

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

… où n est l’indice de base du travailleur indésirable.

J’ai eu un problème similaire, Redis a enregistré la firebase database sur le disque qui comprenait des employés non valides (non actifs). Chaque fois que Redis / Resque était lancé, ils apparaissaient.

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.

Voici comment vous pouvez les purger de Redis par nom d’hôte. Cela m’arrive lorsque je désactive un serveur et que les travailleurs ne s’en sortent pas gracieusement.

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

Je suis tombé sur ce problème et j’ai commencé à mettre en œuvre un grand nombre de suggestions ici. Cependant, j’ai découvert que la cause principale qui créait ce problème était que j’utilisais la gem redis-rb 3.3.0 . La mise à niveau vers la version 3.2.2 de redis-rb a empêché ces travailleurs de restr bloqués.

J’ai commencé à travailler sur https://github.com/shaiguitar/resque_stuck_queue/ récemment. Ce n’est pas une solution à la façon de réparer les travailleurs bloqués, mais cela résout le problème de suspicion / être bloqué, alors j’ai pensé que cela pourrait être utile pour les personnes sur ce sujet. De README:

“Si resque n’exécute pas les travaux dans un certain délai, il déclenchera un gestionnaire prédéfini de votre choix. Vous pouvez l’utiliser pour envoyer un courrier électronique, devoir de pager, append d’autres travailleurs resque, redémarrer resque, vous envoyer un txt. ..tou vous convient. ”

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

J’avais des employés coincés / périmés ici, ou devrais-je dire «emplois», parce que le travailleur est toujours là et fonctionne bien, c’est le processus fourchu qui est bloqué.

J’ai choisi la solution brutale de tuer le processus fourchu “Processing” depuis plus de 5 minutes, via un script bash, puis le travailleur a juste engendré le suivant dans la queue, et tout continue

Regardez mon script ici: https://gist.github.com/jobwat/5712437

Je les ai éliminés directement de Redis-Cli. Heureusement, redistogo.com permet l’access à partir d’environnements extérieurs à Heroku. Obtenez l’identifiant de travailleur mort dans 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 dans les coulisses.

 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.

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

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

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

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

N’oubliez pas que le travail en cours ne se termine pas.

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

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

référence de ce lien