Aug 13 Mongrel: Un fantasma en mis puertos
tags:
Algunas veces el mongrel no levanta porque el puerto esta ocupado aun cuando hayas matado los procesos. El problema parece ser que el Ruby se deja a veces algunos procesos vivos en algunos ambientes de desarrollo. Lo notas por un mensaje como este:
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.1/lib/mongrel/tcphack.rb:12:in `initialize_without_backlog':
Address already in use - bind(2) (Errno::EADDRINUSE)
from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.1/lib/mongrel/tcphack.rb:12:in `initialize'
por suerte contamos en Linux con mas de una manera de encontrar ese fantasma. Por ejemplo este te muestra los PIDs de procesos con archivos abiertos cuya direccion de internet machea la de la opcion -i:
$ lsof -t -i TCP:4000 6849
con el pid puedes pedir mas info sobre el proceso con ps:
$ ps 6849 PID TTY STAT TIME COMMAND 6849 pts/0 Tl 0:01 /usr/bin/ruby1.8 /usr/bin/merb
y vemos que es un merb que se ha quedado frito.
Pero como?, si lo hemos matado, he aqui al ofender:
$ netstat -nap | grep 4000 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:4000 0.0.0.0:* LISTEN 6849/ruby1.8
tambien el mas comun ps aux pero al que algunos procesos se le escapan:
$ ps aux | grep 4000 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:4000 0.0.0.0:* LISTEN 6849/ruby1.8
y claro, “who you gonna call? Ghostsbusters!” por process id o por nombre:
$ kill -9 PID ... $ pkill -9 PNAME