port in use when not using a port

后端 未结 1 1802
情话喂你
情话喂你 2021-02-09 03:57

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

1条回答
  •  礼貌的吻别
    2021-02-09 04:25

    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
    

    0 讨论(0)
提交回复
热议问题