socket.error: [Errno 48] Address already in use

后端 未结 10 2231
小鲜肉
小鲜肉 2020-11-29 14:33

I\'m trying to set up a server with python from mac terminal.

I navigate to folder location an use:

python -m SimpleHTTPServer

Bu

相关标签:
10条回答
  • You can also serve on the next-highest available port doing something like this in Python:

    import SimpleHTTPServer
    import SocketServer
    
    Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
    
    port = 8000
    while True:
        try:
            httpd = SocketServer.TCPServer(('', port), Handler)
            print 'Serving on port', port
            httpd.serve_forever()
        except SocketServer.socket.error as exc:
            if exc.args[0] != 48:
                raise
            print 'Port', port, 'already in use'
            port += 1
        else:
            break
    

    If you need to do the same thing for other utilities, it may be more convenient as a bash script:

    #!/usr/bin/env bash
    
    MIN_PORT=${1:-1025}
    MAX_PORT=${2:-65535}
    
    (netstat -atn | awk '{printf "%s\n%s\n", $4, $4}' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1
    

    Set that up as a executable with the name get-free-port and you can do something like this:

    someprogram --port=$(get-free-port)
    

    That's not as reliable as the native Python approach because the bash script doesn't capture the port -- another process could grab the port before your process does (race condition) -- but still may be useful enough when using a utility that doesn't have a try-try-again approach of its own.

    0 讨论(0)
  • 2020-11-29 15:06

    Simple one line command to get rid of it, type below command in terminal,

    ps -a
    

    This will list out all process, checkout which is being used by Python and type bellow command in terminal,

    kill -9 (processID) 
    

    For example kill -9 33178

    0 讨论(0)
  • 2020-11-29 15:14

    Just in case above solutions didn't work:

    1. Get the port your process is listening to:

      $ ps ax | grep python

    2. Kill the Process

      $ kill PROCESS_NAME

    0 讨论(0)
  • 2020-11-29 15:15

    You already have a process bound to the default port (8000). If you already ran the same module before, it is most likely that process still bound to the port. Try and locate the other process first:

    $ ps -fA | grep python
      501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer
    

    The command arguments are included, so you can spot the one running SimpleHTTPServer if more than one python process is active. You may want to test if http://localhost:8000/ still shows a directory listing for local files.

    The second number is the process number; stop the server by sending it a signal:

    kill 81651
    

    This sends a standard SIGTERM signal; if the process is unresponsive you may have to resort to tougher methods like sending a SIGKILL (kill -s KILL <pid> or kill -9 <pid>) signal instead. See Wikipedia for more details.

    Alternatively, run the server on a different port, by specifying the alternative port on the command line:

    $ python -m SimpleHTTPServer 8910
    Serving HTTP on 0.0.0.0 port 8910 ...
    

    then access the server as http://localhost:8910; where 8910 can be any number from 1024 and up, provided the port is not already taken.

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