たとえば、次の例では 12345 ポートは netstat や lsof でも出てこないし、クライアントから接続することもできません。
# netstat -a | grep 12345 # lsof -i :12345 # telnet localhost 12345 Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refused
が、12345 ポートで LISTEN するサーバーを起動すると Address already in use になってしまいます。
# ruby -rsocket -e 'TCPServer.new(12345)' -e:1:in `initialize': Address already in use - bind(2) for nil port 12345 (Errno::EADDRINUSE) from -e:1:in `new' from -e:1:in `<main>'
どうやら bind(2) した後 listen(2) しなければ、このようなプロセスを作ることができるようです。
# ruby -rsocket -e 'Socket.new(:INET, :STREAM).bind(Addrinfo.tcp("0.0.0.0", 12345)); sleep'
ちなみに lsof でこのプロセスを見ると、問題の Socket ファイルは can't identify protocol
になってました。
# lsof -p 11210 〜(中略)〜 ruby 11210 tommy 7u sock 0,8 0t0 1105451 can't identify protocol
このような状況になったら、どうやればこのプロセスを探し出すことができるんでしょうねぇ…。