Identificar e Matar Workers Zumbis do Resque

Já aconteceu algumas vezes comigo de ter os workers do Resque exportados para o upstart do Ubuntu e precisar substituir por outros.

O problema é que ao excluir os arquivos de configuração de /etc/init e colocar os dos workers novos, por algum motivo o Ubuntu se perde e não sobe o que deveria, mantendo os processos antigos. Se você mata os processos eles voltam.

Uma solução que encontrei para matar os processos zumbis é entrar no console da aplicação Rails, identificar os workers antigos (você pode fazer isso via comando ou vendo pela interface web do Resque mesmo) e removê-los.

Para ver os nomes dos workers rode:

Resque.workers.select{|worker| puts worker}

Para remover um worker do Resque:

Resque.remove_worker('nome-do-worker')

Caso tenha muitos e deseja matar todos, a junção dos dois também deve funcionar:

Resque.workers.select{|worker| Resque.remove_worker(worker) }

Agora é só reiniciar seu job no upstart, esperar ele subir e pronto.

Modo hard

Caso o procedimento acima não resolva, podemos fazer da seguinte forma:

Execute o comando netstat com os parâmetros ntp para procurar por conexões TCP que ainda estão estabelecidas na porta 6379 (porta padrão do redis)

user@server:~$ sudo netstat -ntp | grep 6379
tcp 0 0 127.0.0.1:6379 127.0.0.1:44597 ESTABLISHED 1671/redis-server
tcp 0 0 127.0.0.1:6379 127.0.0.1:44543 FIN_WAIT2 -
tcp 0 0 127.0.0.1:44597 127.0.0.1:6379 ESTABLISHED 1492/puma.sock)
tcp 0 0 127.0.0.1:6379 127.0.0.1:55760 ESTABLISHED 1671/redis-server
tcp 0 0 127.0.0.1:46408 127.0.0.1:6379 TIME_WAIT -
tcp 0 0 127.0.0.1:55760 127.0.0.1:6379 ESTABLISHED 8223/resque-1.25.2:
tcp 0 0 127.0.0.1:46410 127.0.0.1:6379 TIME_WAIT -
tcp 1 0 127.0.0.1:54364 127.0.0.1:6379 CLOSE_WAIT 14490/ruby
tcp 0 0 127.0.0.1:46402 127.0.0.1:6379 TIME_WAIT -
tcp 0 0 127.0.0.1:37607 127.0.0.1:6379 TIME_WAIT -
tcp 0 0 127.0.0.1:50442 127.0.0.1:6379 TIME_WAIT -
tcp 0 0 127.0.0.1:37608 127.0.0.1:6379 TIME_WAIT -
tcp 1 0 127.0.0.1:44543 127.0.0.1:6379 CLOSE_WAIT 7395/current

Estamos interessados somente nas linhas em que ainda há conexões abertas (ESTABLISHED), se quiser, pode aplicar mais um grep com pipe para filtrar a saída:

user@server:~$ sudo netstat -ntp | grep 6379 | grep ESTABLISHED
tcp 0 0 127.0.0.1:6379 127.0.0.1:44597 ESTABLISHED 1671/redis-server
tcp 0 0 127.0.0.1:44597 127.0.0.1:6379 ESTABLISHED 1492/puma.sock)
tcp 0 0 127.0.0.1:6379 127.0.0.1:55760 ESTABLISHED 1671/redis-server
tcp 0 0 127.0.0.1:55760 127.0.0.1:6379 ESTABLISHED 8223/resque-1.25.2:

Ficou fácil observar que o worker zumbi é o worker de PID 8223 (único worker resque que ainda está conectado mesmo quando todos deveriam estar desativados), para checar se isso é verdade você pode usar um ps aux:

user@server:~$ ps aux | grep 8223
user 5008 0.0 0.0 8080 620 pts/4 S+ 16:20 0:00 grep 8223
deploy 8223 0.0 3.7 1311088 286760 ? Sl Dec04 5:42 resque-1.25.2: Waiting for scraper, mailer e normal

Um worker escutando as filas scraper, mailer e normal que não está ligado a aplicação. Agora é só matá-lo:

user@server:~$ sudo kill -9 8223

E reiniciar os workers.

Abraços.

Written on September 3, 2013

Share: