Mongrel: Un fantasma en mis puertos

Posted by joahking
on Aug 13, 08
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
Comments

Leave a response

  1. GuillermoAug 13 08 @ 11:37PM
    Pero hombre de dios !!!!

    Como tratas así a los procesos. ¡¡¡ Asesino !!!

    Intenta por experiencia, no a usar el kill -9, que te acostumbras, lo usas en servidores de producción, y pueden dejar algún recurso sin liberar y desaparecer el proceso.

    Invitales a terminar con SIGTERM primero
    kill -SIGTERM PID
    Y ya si están revoltosos les matas.

    Para completar un poco la información, kill -l (ele), muestra todas las señales del sistema, y puede ser divertido enviarlas de vez en cuando. Por ejemplo, poder enviar un control+c(SIGINT) a un proceso que no tiene consola o está en background. En el caso de merb y rails suelen responder.

    Un Saludo y felicidades por el blog.
  2. joahkingAug 16 08 @ 02:33PM
    muchas gracias Guillermo por la aclaracion, siempre es de tratar con cuidado a los servidores de produccion ;-)
  3. joahkingNov 05 08 @ 07:50PM

    cuando te aburras de usarlos separados siempre puedes mejorar tu teclear asi: kill -9 `lsof -t -i TCP:3000`

Comment