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
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.
cuando te aburras de usarlos separados siempre puedes mejorar tu teclear asi: kill -9 `lsof -t -i TCP:3000`