Detectando el Proceso que está Usando un Puerto

Si intentamos ejecutar una segunda instancia del servidor mientras otra instancia esta ejecutandose obtenemos un error que indica que el puerto está en uso:

[~/sinatra/sinatra-simple(master)]$ rackup
Thin web server (v1.6.1 codename Death Proof)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop
/Users/casiano/.rvm/gems/ruby-2.0.0-p247/gems/eventmachine-1.0.3/lib/eventmachine.rb:526:
  in `start_tcp_server': no acceptor 
  (port is in use or requires root privileges) (RuntimeError)
  from /Users/casiano/.rvm/gems/ruby-2.0.0-p247/gems/eventmachine-1.0.3/lib/eventmachine.rb:526:
    in `start_server'
...
Si sabemos en que puerto esta corriendo - como es el caso - podemos hacer algo así para saber el PID del proceso que lo ocupa:
[~/sinatra/sinatra-simple(master)]$ lsof -i :9292
COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    52870 casiano    9u  IPv4 0x9f3ffc595152af29      0t0  TCP *:armtechdaemon (LISTEN)
Si no lo sabemos podemos hacer:
[~/sinatra/sinatra-simple(master)]$ ps -fA | egrep ruby
  501 52870   565   0 11:16AM ttys003    0:00.61 ruby /Users/casiano/.rvm/gems/ruby-2.0.0-p247/bin/rackup
  501 53230 52950   0 11:35AM ttys006    0:00.00 egrep ruby
Si tenemos privilegios suficientes podemos ahora eliminar el proceso:
[~/sinatra/sinatra-simple(master)]$ kill -9 52870

[~/sinatra/sinatra-simple(master)]$ rackup
Thin web server (v1.6.1 codename Death Proof)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop
Killed: 9

El comando

$ lsof -i | egrep -i 'tcp.*(\d+.)+'
Nos da una lista bastante completa de como están nuestras conexiones.
  1. -i [i] selects the listing of files any of whose Internet address matches the address specified in i. If no address is specified, this option selects the listing of all Internet and x.25 (HP-UX) network files.

Casiano Rodriguez León 2015-01-07