Ruby, Webrick think every local port is already in use - ruby

I am developing a static site locally. To view it in a browser, I run this command
ruby -run -ehttpd . -p8000
to run a local webserver at localhost:8000.
Starting yesterday, when I run it, I get the error
INFO WEBrick 1.3.1
INFO ruby 2.0.0 (2015-12-16) [universal.x86_64-darwin16]
WARN TCPServer Error: Address already in use - bind(2)
INFO WEBrick::HTTPServer#start: pid=1158 port=8000
So I change the port number -p8000 to p8001 and I get the same error. I try 8002, 8003, 8888, 1313, 8004. I the same error on every single port number. Ruby, or Webrick, thinks that every port is already in use.
All the solutions to this problem I can find online suggest finding whatever process is hogging the port using commands like lsof | grep '8000' or lsof -wni tcp:8000 and then killing that process. But those commands don't return anything. There are no processes using those ports.
This happens on a fresh restart of my machine. Wifi turned off.

Related

How do I find and terminate a process listening to a port when I can't find it on my machine?

Attempting to kill port and locate possible process paths
I'm trying to use the Postgres.app to utilize the database, but keep running into the "Port in use" issue. I had originally brew installed postgres, but opted to use the app instead. So I brew removed postgres and installed Postgres.app. But now when I try to connect, it says that the port is in use. From everything that I've read, postgresql is the only process that listens at that port (I'm not using any other databases like MySQL). So, I was going to try to use the sudo launchctl unload -w /path_to/process command, but as you can see above...when I use which postgres or which postgresql, there's no path found. I also tried killing the connection to the port, but the ghost postgresql automatically connects right afterwards. Any tips on how to find out what the heck is listening on the port and prevent it from auto-connecting?
Edit: I tried using the Activity Monitor to see if I had accidentally installed a second version of the postgres.app. I checked to see what was the PID of the process listening in on the port. But it's not listed in the activity monitor. So I still have no idea how to find whatever is listening on the port
PID not listed in Activity monitor screen

Docker container not responding

I am setting up a container manually to create a proper Docker file.
I am starting from bitnami/ruby:latest a container with the following syntax:
sudo docker run -p 4567:4567 --name vcaexplorer bitnami/ruby bash
The container gets instantiated correctly:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ac394d247a4 bitnami/ruby "/entrypoint.sh bash" 37 minutes ago Up 37 minutes 3000/tcp, 0.0.0.0:4567->4567/tcp vcaexplorer
I am downloading the follwoing repo with this syntax:
git clone https://github.com/mreferre/vcautils.git /app/vcautils
I then start the Sinatra app in the /app/vcautils/lib directory.
It looks like this:
bitnami#1ac394d247a4:/app/vcautils/lib$ ruby vcaexplorer.rb
vcaexplorer.rb:36: warning: already initialized constant OpenSSL::SSL::VERIFY_PEER
vcaexplorer.rb:39: warning: class variable access from toplevel
vcaexplorer.rb:40: warning: class variable access from toplevel
vcaexplorer.rb:41: warning: class variable access from toplevel
[2015-09-24 21:42:48] INFO WEBrick 1.3.1
[2015-09-24 21:42:48] INFO ruby 2.2.3 (2015-08-18) [x86_64-linux]
== Sinatra (v1.4.6) has taken the stage on 4567 for development with backup from WEBrick
[2015-09-24 21:42:48] INFO WEBrick::HTTPServer#start: pid=255 port=4567
when I try to connect to dockerhost:4567 it gives me a black eye. It says there is nothing there.
I tried to install net-utils in the container and I started the Sinatra app in background (with &). It seems to be starting in background but when I run netstat nothing is listed (but the process is there).
The docker host is in good shape because if I try other containers all the internal NATting works fine and I can access the containers from the outside.
Even the app is in good shape as if I start it locally on my laptop with the same command it gives me the same "output" and I can connect to localhost:4567
It must be something with the way I am instantiating the container (using bash?)
Thoughts?
Thanks. Massimo.

debugging a sinatra app with rubmine

I'm trying to debug a sinatra app using RubyMine. I am using rackup to run the app on localhost and unicorn to run it on remote host. My ruby version is 1.9.3.
I should also note that the "run debug mode icon" is grayed out. I don't know what is missing from the configuration.
What gems do I need? What else do I need to do?
update:
I have run the server process on localhost using rackup -p 9000. In order to start debugging -run rdebug-ide --port 1234 -- rackup and got this message :
Fast Debugger (ruby-debug-ide 0.4.17.beta16, ruby-debug-base 0.10.5.rc1) listens on 127.0.0.1:1234
I still don't understand how to debug using Rubymine. I have opened the browser in http://0.0.0.0:1234 and I don't get any response (it keeps loading)
I run the remote host using unicorn like so :
unicorn -c etc/fin_srv_unicorn.conf -E staging
how shold I set up remote debugging? I have tried also rack and ruby remote.
Tried connection to the remote host and running the service (using the command listed above), and then running the rdebug like so :
rdebug-ide --port 1911 -- $SCRIPT$
where for $SCRIPT$ I have tried app/main.rb staging , unicorn -E staging, unicorn -c etc/fin_srv_unicorn.conf -E staging

port in use when not using a port

I'm trying to run the following Sinatra application and am getting an error message telling me that I can't start a server, either because port's already in use or because I don't have root privileges. I have never had this problem before starting a Sinatra application. I updated to Mountain Lion for my mac a few days ago and wonder if this might be the cause of the problem. I also use RVM. Can anyone provide a suggestion...
require "sinatra"
class MyApp < Sinatra::Base
get '/' do
"Hello from MyApp"
end
end
== Sinatra/1.3.3 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop
/Users/me/.rvm/gems/ruby-1.9.2-p290#global/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Update:
I can still run a rails server on my machine so I think the problem is specific to Sinatra. Furthermore, I was able to run Sinatra applications fine up til a few days ago, when I started playing around with this Rack Tutorialwhich instructed me to explicitly to set a port. I'm wondering if that made a permanent change.
>> Rack::Handler::WEBrick.run my_rack_proc, :Port => 9876
[2011-10-24 11:32:21] INFO WEBrick 1.3.1
[2011-10-24 11:32:21] INFO ruby 1.9.2 (2011-07-09) [i386-mingw32]
[2011-10-24 11:32:21] INFO WEBrick::HTTPServer#start: pid=480 port=9876
Note: I had a different answer before. I've replaced it with a new, more focused answer, but I left the old answer at the bottom for anyone still looking for it.
New answer:
This error is caused by the fact that the last time you had a server running, you closed the terminal without killing the server. I believe this is called 'running headless', like a chicken with its head cut off. So even though nobody is around watching, the server is still running and taking up the 'space' called port 9393. When you try to start a new server, there is already one running. It's kind of like a parking spot: since there is already a car there, you can't part a new one in the same spot.
Here's how I reproduced the error. I booted up a sinatra server, closed down the terminal without killing the server first, opened up a new terminal, and tried to boot up another server.
Taras-MacBook-Air:SurveyDBCGroupProject tlroys$ shotgun
== Shotgun/Thin on http://127.0.0.1:9393/
Thin web server (v1.6.1 codename Death Proof)
Maximum connections set to 1024
Listening on 127.0.0.1:9393, CTRL+C to stop
/Users/tlroys/.rvm/gems/ruby-1.9.3-p484/gems/eventmachine-1.0.3/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
#deleted stack trace
What do you do if a car is parked in your spot? You can call the tow truck and tell the driver the license plate number of the car, and tell them to tow it away.
To find out the license plate number of the car, run the following set of commands I found on Stack Overflow
ps aux | grep ruby
This finds the process id, aka the license plate number of the 'car' occupying the 'parking spot.' Note: the server occupying my 'spot' is in fact a server written using the programming language ruby: sort of like some cars are Chevorlets. I can tell the person finding out the license plate number to look for the chevrolet, and he will find the right car as long as there are no other cars around. Since this 'zombie server' is the only ruby process running on my computer, telling the grep command to look for ruby will give the right process id/ license plate numbers. If I wanted to be more specific, I could probably say
ps aux | grep shotgun
and get the same result.
-The output should look like this: there should be two things in the list
27235 ?? S 0:00.72 /Users/tlroys/.rvm/gems/ruby-1.9.3-p484/bin/shotgun
27393 s000 S+ 0:00.00 grep ruby
The first one is the actual 'zombie server' you are looking for. The second thing is funny, because you are looking for all processes that contains the word ruby, and so it find the process that is looking for all processes that contain the word ruby. Haha.
Kill the first process. with the following command. Make sure to change the numbers to the actual process id:
kill -9 27235
You'll have to change the 27235 to the actual process id that you see, but you get the idea. The tow truck has come, dragged the car away to the junkyard, and left the spot free for me to use.
Old answer:
I had exactly the same issue, and as far as I can tell it was because there was a ruby process running on the port that I run my sinatra apps on. Below is the error (With the stack trace remove for brevity's sake) and the commands I ran to figure out what was going wrong and fix it.
In short, I tried to start my sinatra app, and it said port is in use or required root privileges. I then used the Tin Man's lsof command (seen above) to find out what ports were in use.
It showed that ruby was running on port 9393. I killed it with killall. I tried starting my sinatra app again. It worked.
Taras-MacBook-Air:sinatra_sandbox tlroys$ bundle exec shotgun config.ru
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
== Shotgun/Thin on http://127.0.0.1:9393/
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 127.0.0.1:9393, CTRL+C to stop
/Users/tlroys/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Taras-MacBook-Air:sinatra_sandbox tlroys$ lsof -i TCP | grep LISTEN
ruby 59176 tlroys 9u IPv4 0xffffff8012fbdc00 0t0 TCP localhost:9393 (LISTEN)
Taras-MacBook-Air:sinatra_sandbox tlroys$ killall ruby
Taras-MacBook-Air:sinatra_sandbox tlroys$ bundle exec shotgun config.ru
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
Shotgun/Thin on http://127.0.0.1:9393/
Thin web server (v1.5.0 codename Knife)
Maximum connections set to 1024
Listening on 127.0.0.1:9393, CTRL+C to stop
The restriction about only root being able to open "well known port#s" has nothing to do with Ruby - it's an OS thing. It's also, in general, a Good Thing.
Look at "cannot start sinatra process - eventmachine 'no acceptor'".
There are two suggestions in the link:
The configuration issue he encountered might well fix your problem
If nothing else, the link also shows you how to change the port# (to some different - and perhaps higher) number.

cannot start sinatra process - eventmachine "no acceptor"

I have a Sinatra app that I run as a daemon, using Apache port-forwarding to mediate between port 80 and port 7655. This has been working fine in the past. Today, not so well. I cannot figure out why.
Problem: sudo ruby my_process.rb returns:
/var/lib/gems/1.9.1/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Tried: updating all system packages, updating all gems. No help (except for the more clear error message from eventmachine).
When I run sudo lsof -i :7655 I get nothing back. When I run sudo ps aux I don't see any Ruby processes at all. Which I find highly irregular, given the nature of the error message!
So is there something I'm missing in finding out why the port is unavailable?
Also:
Tried changing ports, nothing. I wonder if it is related to "localhost"? When I ping localhost I get all dropped packets. That doesn't seem normal.
Turns out these two lines in the main Sinatra script provided the most information:
set bind: "localhost"
set port: 7655
The problem was with localhost. The loopback interface was not properly configured. ifconfig showed the lo interface, but it hadn't been assigned the IP 127.0.0.1. To resolve, ran the following commands in the shell (on an Ubuntu Linux system):
ifdown lo
ifup lo
When you close term sometime you forget to stop [CTRL+C] the actual server, just run the following command to kill all ruby process like sinatra, and run-it again
killall ruby
You can see your actual ruby process by running
ps -ef | grep ruby

Resources