Como você pode ver na imagem em anexo, tenho alguns trabalhadores que parecem estar presos. Esses processos não devem demorar mais que alguns segundos.
Não sei por que eles não serão limpos ou como removê-los manualmente.
Estou no Heroku usando o Resque com Redis-to-Go e HireFire para dimensionar automaticamente os trabalhadores.
ruby-on-rails
ruby-on-rails-3
heroku
redis
resque
Shpigford
fonte
fonte
Respostas:
Nenhuma dessas soluções funcionou para mim; eu ainda veria isso no redis-web:
Finalmente, funcionou para mim limpar todos os trabalhadores:
fonte
heroku restart
parecia fazer o truque. Agora, mostra o número correto de trabalhadores.Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
que apenas cancelará o registro dos trabalhadores cujos pids não fazem parte dos pids em execução conhecidos. Não sei se isso funciona em todos os ambientes, mas funciona bem no ubuntu. Isso pode funcionar apenas quando seus funcionários estiverem na mesma máquina em que você executa esse código.unregister_worker
? Existe uma maneira de determinar isso?No seu console:
Caso contrário, você pode tentar falsificá-los como sendo feitos para removê-los, com:
EDITAR
Muitas pessoas estão votando positivamente nesta resposta e eu sinto que é importante que as pessoas tentem a solução do hagope que cancela o registro de trabalhadores de uma fila, enquanto o código acima exclui filas. Se você está feliz em falsificá-los, então legal.
fonte
Você provavelmente tem a gem resque instalada, para poder abrir o console e obter trabalhadores atuais
Retorna uma lista de trabalhadores
escolha o trabalhador e
prune_dead_workers
, por exemplo, o primeirofonte
Além de responder por hagope, eu queria poder cancelar apenas o registro de trabalhadores que estavam em execução por um determinado período de tempo. O código abaixo cancelará o registro de trabalhadores em execução por mais de 300 segundos (5 minutos).
Tenho uma coleção contínua de tarefas Rake relacionadas ao Resque às quais também adicionei isso: https://gist.github.com/ewherrmann/8809350
fonte
Execute este comando onde quer que você tenha executado o comando para iniciar o servidor
você deve ver algo assim:
Anote o PID (identificação do processo) no meu exemplo. 92102
Em seguida, você pode encerrar o processo 1 de 2 maneiras.
Use graciosamente
QUIT 92102
Use com força
TERM 92102
* Não tenho certeza da sintaxe que é
QUIT 92102
ouQUIT -92102
Deixe-me saber se você tiver algum problema.
fonte
Eu apenas fiz:
Consegui a lista de trabalhadores.
... onde n é o índice baseado em zero do trabalhador indesejado.
fonte
Eu tive um problema semelhante que o Redis salvou o banco de dados no disco que incluía trabalhadores inválidos (não em execução). Cada vez que o Redis / resque foi iniciado, eles apareciam.
Corrija isso usando:
Certifique-se de reiniciar o Redis e seus funcionários do Resque.
fonte
Veja como você pode removê-los do Redis pelo nome do host. Isso acontece comigo quando eu desativo um servidor e os trabalhadores não saem normalmente.
fonte
Eu me deparei com esse problema e comecei a implementar muitas sugestões aqui. No entanto, eu descobri que a causa raiz que estava criando esse problema foi o uso do gem redis-rb 3.3.0 . A atualização para o redis-rb 3.2.2 impediu que esses trabalhadores ficassem presos em primeiro lugar.
fonte
Começou a trabalhar em https://github.com/shaiguitar/resque_stuck_queue/ recentemente. Não é uma solução de como consertar trabalhadores presos, mas aborda a questão de resque pendurar / ficar preso, então achei que poderia ser útil para as pessoas desse segmento. Do README:
"Se o resque não executar trabalhos dentro de um determinado período de tempo, ele acionará um manipulador predefinido de sua escolha. Você pode usar isso para enviar um email, serviço de pager, adicionar mais trabalhadores do resque, reiniciar o resque, enviar um txt. ..qualquer combina com você. "
Foi usado na produção e funciona muito bem para mim até agora.
fonte
Também tive trabalhadores presos ou obsoletos aqui, ou devo dizer 'empregos', porque o trabalhador ainda está lá e funcionando bem, é o processo bifurcado que está preso.
Eu escolhi a solução brutal de matar o processo bifurcado "Processing" desde mais de 5 minutos, por meio de um script bash, então o trabalhador apenas gera o próximo na fila e tudo continua em andamento
dê uma olhada no meu script aqui: https://gist.github.com/jobwat/5712437
fonte
Eu os limpei diretamente do redis-cli. Felizmente, redistogo.com permite acesso a partir de ambientes externos ao heroku. Obter ID do trabalhador morto da lista. O meu era
Execute este comando em redis diretamente.
Você pode monitorar o redis db para ver o que está fazendo nos bastidores.
A segunda última linha exclui o trabalhador.
fonte
Se você estiver usando versões mais recentes do Resque, precisará usar o seguinte comando, pois as APIs internas foram alteradas ...
fonte
Isso evita o problema, desde que você tenha uma versão resque mais recente que 1.26.0:
Lembre-se de que ele não permite que o trabalho atualmente em execução seja concluído.
fonte
você também pode usar o comando abaixo para parar todos os
rescue
trabalhadoresreferência a partir deste link
fonte