2011-09-14 4 views
108

Come potete vedere dall'immagine allegata, ho un paio di lavoratori che sembrano bloccati. Questi processi non dovrebbero richiedere più di un paio di secondi.Come si rimuovono i lavoratori resque bloccati/non aggiornati?

enter image description here

non sono sicuro perché non sarà chiaro o come rimuovere manualmente.

Sono su Heroku utilizzando Resque con Redis-to-Go e HireFire per scalare automaticamente i lavoratori.

+2

Ciao, domanda semi-correlata: come hai ottenuto il cruscotto di resque-web via heroku? Non riesco a capire come aprirlo. –

risposta

200

Nessuna di queste soluzioni ha lavorato per me, sarei ancora vedere questo in Redis-web:

0 out of 10 Workers Working 

Infine, questo ha lavorato per me per cancellare tutti i lavoratori:

Resque.workers.each {|w| w.unregister_worker} 
+11

Questo ha funzionato per me. I lavoratori non registrati * tutti * erano un po 'fastidiosi. Ma questo seguito da "heroku restart" sembrava fare il trucco. Ora mostra il numero corretto di lavoratori. –

+0

Questo ha funzionato anche per me! –

+0

Ciò ha eliminato i lavoratori dall'interfaccia Web, ma in realtà continuano a essere visualizzati come processi e anche "rubano" i lavori dalla coda – txwikinger

25

Avete probabilmente la gemma resque installato, in modo da poter aprire la console e ottenere i lavoratori attuali

Resque.workers 

Esso restituisce un elenco dei lavoratori

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

raccogliere il lavoratore e prune_dead_workers, ad esempio, il primo

Resque.workers.first.prune_dead_workers 
+0

In realtà, al secondo tentativo, questo non ha fatto nulla. – Shpigford

+2

Funziona perfettamente per eliminare i lavoratori resque che sono stati uccisi senza annullare la registrazione. –

+3

Questa sembra la nuova migliore risposta dal momento che non annulla la registrazione di tutti loro. Non dovrei prune_dead_workers essere un metodo di classe? Ma in ogni caso, ottima soluzione! Grazie. –

8

Esegui questo comando ovunque tu abbia eseguito il co mmand per avviare il server

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

si dovrebbe vedere qualcosa di simile:

92102 resque: Processing ProcessNumbers since 1253142769 

Annotare il PID (id di processo) nel mio esempio è

allora si può abbandonare il processo 1 di 2 modi.

  • garbo utilizzare QUIT 92102

  • con forza uso TERM 92102

* non sono sicuro della sintassi è sia QUIT 92102 o QUIT -92102

fatemi sapere se si avere qualche problema

+3

Nella console Linux: kill -SIGQUIT 92102 – Alexey

45

In console:

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

Altrimenti si può provare a loro falsi come sta facendo per rimuoverli, con:

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

EDIT

Un sacco di persone hanno state inviando questa risposta e ritengo sia importante che le persone provino la soluzione di hagope che cancella i lavoratori da una coda, mentre il codice sopra code di etes. Se sei felice di simularli, allora è bello.

+3

Se lo fa, eliminerà l'intera coda, vuole solo rimuovere il blocco .. – jBeas

+1

Piccolo aggiornamento: Ora devi utilizzare Resque.redis.del invece di Resque.redis.delete –

+1

Esiste in realtà un metodo Resque.remove_queue() ora – iainbeeston

2

ho avuto un problema simile che Redis ha salvato il DB sul disco che includeva lavoratori non validi (non in esecuzione). Sono comparsi ogni volta che Redis/Resque è stato avviato.

fissarlo con:

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

Assicurarsi di riavviare Redis ei vostri lavoratori Resque.

+0

Questo era l'unico modo in cui avrei potuto chiarire le cose. Grazie – simonmorley

0

Anche in questo caso avevo bloccato/usato i resque resque, o dovrei dire "job", perché il lavoratore è ancora lì e funziona bene, è il processo biforcuto che è bloccato.

ho scelto la soluzione brutale di uccidere il processo biforcuta "Processing" da più di 5 minuti, tramite uno script bash, quindi il lavoratore solo deporre le uova il prossimo in coda, e tutto continua a andare avanti

dare un'occhiata a il mio script qui: https://gist.github.com/jobwat/5712437

6

ho appena fatto:

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

ottiene l'elenco dei lavoratori.

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

... dove n è l'indice a base zero del lavoratore indesiderato.

0

Li ho cancellati da redis-cli direttamente. Fortunatamente redistogo.com consente l'accesso da ambienti esterni a heroku. Ottieni l'ID lavoratore morto dall'elenco. Il mio era

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

Eseguire questo comando in redis direttamente.

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

È possibile monitorare Redis db per vedere cosa sta facendo dietro le quinte.

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 penultima riga cancella il lavoratore.

+0

Non è una buona idea. Ciò non chiamerà gli hook di registrazione in Resque, non chiamando il fallimento e il possibile codice di pulizia che le persone potrebbero avere. – Jeremy

+0

Questo è stato utile con resque 2 anni fa quando mostrava lavori bloccati che erano impossibili da eliminare usando l'interfaccia e non c'era un modo pulito per farlo nelle guide –

1

Ha iniziato a lavorare su https://github.com/shaiguitar/resque_stuck_queue/ di recente. Non è una soluzione a come risolvere i lavoratori bloccati, ma affronta il problema di resque hanging/essere bloccato, quindi ho pensato che potrebbe essere utile per le persone su questo thread. Da README:

"Se resque non esegue i lavori entro un determinato periodo di tempo, attiverà un gestore predefinito a tua scelta.È possibile utilizzare questo per inviare un messaggio di posta elettronica, dovere pager, aggiungere più resque lavoratori, riavviare resque, ti mando un txt ... quello che fa per te. "

È stato utilizzato in produzione e funziona abbastanza bene per me finora.

22

Aggiungendo la risposta per via delle accuse, volevo poter solo annullare la registrazione dei lavoratori in esecuzione da un certo periodo di tempo. Il seguente codice annulla solo la registrazione dei lavoratori in esecuzione per oltre 300 secondi (5 minuti).

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

Ho un insieme continuo di Resque relativi Rake compiti che ho anche aggiunto che questo: https://gist.github.com/ewherrmann/8809350

+3

Punti per mostrare come accedere all'orario di inizio del lavoro tramite l'elaborazione ['run_at ']. Ho visto altre soluzioni che utilizzano il metodo .started, ma in realtà restituisce il tempo in cui * worker * è stato avviato, non il lavoro, che è l'approccio sbagliato per la rimozione dei lavoratori bloccati. Grazie! –

2

Ecco come si possono eliminare da Redis da hostname. Questo mi succede quando decluisco un server e gli addetti non escono con garbo.

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

Se si utilizzano versioni più recenti di Resque, è necessario utilizzare il seguente comando come le API interne sono cambiate ...

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

questo modo si evita il problema fino a quando si dispone di una versione più recente rispetto a Resque 1.26.0:

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

Tenete a mente che non si lascia la finitura lavoro attualmente in esecuzione.

2

Mi sono imbattuto in questo problema e ho iniziato il percorso di implementazione di molti dei suggerimenti qui. Tuttavia, ho scoperto che la causa principale che stava creando questo problema era che ero using the gem redis-rb 3.3.0. Il downgrade a redis-rb 3.2.2 ha impedito a questi lavoratori di rimanere bloccati in primo luogo.