it-swarm.it

Come posso cancellare i lavoratori Resque bloccati / stantii?

Come puoi vedere dall'immagine allegata, ho un paio di lavoratori che sembrano bloccati. Tali processi non dovrebbero richiedere più di un paio di secondi.

enter image description here

Non sono sicuro del motivo per cui non verranno cancellati o come rimuoverli manualmente.

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

131
Shpigford

Nessuna di queste soluzioni ha funzionato per me, lo vedrei ancora in redis-web:

0 out of 10 Workers Working

Alla fine, questo ha funzionato per me per cancellare tutti i lavoratori:

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

Nella tua console:

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

Altrimenti puoi provare a falsificarli come fatto per rimuoverli, con:

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

[~ ~ #] modifica [~ ~ #]

Molte persone hanno votato a favore di questa risposta e ritengo sia importante che le persone provino la soluzione di hagope che annulla la registrazione dei lavoratori in una coda, mentre il codice sopra elimina le code. Se sei felice di falsificarli, allora fico.

49
Simpleton

Probabilmente hai installato la gemma resque, quindi puoi aprire la console e ottenere gli attuali lavoratori

Resque.workers

Restituisce un elenco di lavoratori

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

scegli il lavoratore e Prune_dead_workers, ad esempio il primo

Resque.workers.first.Prune_dead_workers
28
Shairon Toledo

Aggiungendo la risposta di hagope, volevo essere in grado di annullare la registrazione solo dei lavoratori che erano in esecuzione da un certo periodo di tempo. Il codice seguente annulla 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 una raccolta in corso di attività Rake correlate a Resque che ho anche aggiunto a: https://Gist.github.com/ewherrmann/880935

24
ewH

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

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

dovresti vedere qualcosa del genere:

92102 resque: Processing ProcessNumbers since 1253142769

Prendi nota del PID (ID processo) nel mio esempio è 92102

Quindi è possibile uscire dal processo 1 di 2 modi.

  • Usa con grazia QUIT 92102

  • Usa con forza TERM 92102

* Non sono sicuro della sintassi sia QUIT 92102 O QUIT -92102

Fammi sapere se hai qualche problema.

9
jBeas

Ho appena fatto:

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

Ho la lista dei lavoratori.

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

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

6
user2811637

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

2
Will Bryant

Ho avuto un problema simile nel fatto che Redis ha salvato il DB su disco che includeva lavoratori non validi (non in esecuzione). Ogni volta che Redis/resque è stato avviato sono comparsi.

Risolvilo usando:

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

Assicurati di riavviare Redis e i tuoi dipendenti Resque.

2
joost

Ecco come è possibile eliminarli da Redis per nome host. Questo succede a me quando dismesso un server e i lavoratori non escono con garbo.

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

Ha iniziato a lavorare su https://github.com/shaiguitar/resque_stuck_queue/ di recente. Non è una soluzione su come risolvere i lavoratori bloccati, ma affronta il problema della sospensione/dell'essere bloccato, quindi ho pensato che potesse 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 di tua scelta. Puoi utilizzarlo per inviare un'e-mail, un servizio cercapersone, aggiungere altri lavoratori resque, riavviare resque, inviare un txt. ..qualunque cosa ti si adatti. "

Sono stato usato in produzione e funziona abbastanza bene per me finora.

1
Shai

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

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

Esegui questo comando in redis direttamente.

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

Puoi 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 seconda ultima riga elimina il lavoratore.

0
Andrei R

Questo evita il problema fintanto che hai una versione resque più recente della 1.26.0:

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

Tenere presente che non consente il completamento del processo in esecuzione.

0
Joakim Kolsjö

Se stai utilizzando le versioni più recenti di Resque, dovrai utilizzare il seguente comando poiché le API interne sono cambiate ...

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

puoi anche usare il comando seguente per fermare tutto rescue worker

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

riferimento da questo link

0
uzaif

Anche qui avevo lavoratori bloccati/stantii, o dovrei dire "lavori", perché il lavoratore è effettivamente ancora lì e sta andando bene, è il processo biforcato che è bloccato.

Ho scelto la brutale soluzione di uccidere il processo biforcuto "Elaborazione" da più di 5 minuti, tramite uno script bash, quindi il lavoratore ha appena generato il successivo in coda e tutto continua ad andare avanti

dai un'occhiata al mio script qui: https://Gist.github.com/jobwat/5712437

0
jobwat