Aug 13 Mongrel: Un fantasma en mis puertos

tags: ruby process kill pkill mongrel | comments

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
blog comments powered by Disqus