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.