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: