Socket.error: [Errno 48] Адрес уже используется

Я пытаюсь настроить сервер с помощью python с терминала mac.

Я перехожу к месту расположения папки:

python -m SimpleHTTPServer

Но это дает мне ошибку:

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

Я ранее открывал соединение, используя ту же команду для другого веб-сайта в другом месте на моей машине.

Ответ 1

У вас уже есть процесс, связанный с портом по умолчанию (8000). Если вы уже запускали тот же модуль раньше, скорее всего, этот процесс все еще связан с портом. Сначала попробуйте найти другой процесс:

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

Аргументы команды включены, поэтому вы можете определить, какой из них работает SimpleHTTPServer, если активен более одного процесса python. Вы можете протестировать, если http://localhost:8000/ все еще показывает список каталогов для локальных файлов.

Второе число - номер процесса; остановите сервер, отправив ему сигнал:

kill 81651

Отправляет стандартный сигнал SIGTERM; если процесс не отвечает, вам, возможно, придется прибегать к более жестким методам, например, вместо отправки сигнала SIGKILL (kill -s KILL <pid> или kill -9 <pid>). Подробнее см. Wikipedia.

Кроме того, запустите сервер на другом порту, указав альтернативный порт в командной строке:

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

затем обратитесь к серверу как http://localhost:8910; где 8910 может быть любым числом от 1024 и выше, если порт еще не выполнен.

Ответ 2

Простое решение:

  • Найдите процесс с помощью порта 8080:

    sudo lsof -i:8080

  • Убейте его:

    kill XXXX

Ответ 3

использование

 sudo lsof -i:5000

Это даст вам список процессов, использующих порт, если таковые имеются. Как только список процессов задан, используйте идентификатор в столбце PID, чтобы прекратить использование процесса

 kill 379 #use the provided PID

Ответ 4

Кстати, чтобы это не происходило в первую очередь, просто нажмите Ctrl + C в терминале, в то время как SimpleHTTPServer все еще работает нормально. Это "правильно" остановит сервер и освободит порт, чтобы вам не пришлось снова находить и убивать процесс перед перезагрузкой сервера.

(Моды: я постарался поставить этот комментарий на лучший ответ, где он принадлежит, но у меня недостаточно репутации.)

Ответ 5

Вы также можете использовать следующий доступный порт, выполняющий что-то вроде этого в 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

Если вам нужно сделать то же самое для других утилит, это может быть более удобно как 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

Задайте это как исполняемый файл с именем get-free-port, и вы можете сделать что-то вроде этого:

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

Это не так надежно, как родной подход Python, потому что bash script не фиксирует порт - другой процесс может захватить порт до вашего процесса (состояние гонки) - но все же может быть достаточно полезным при использовании утилиты, которая не имеет собственного метода try-try-again.

Ответ 6

Я новичок в Python, но после краткого исследования я обнаружил, что это типично для связывания сокетов. Просто так получилось, что сокет все еще используется, и вам, возможно, придется подождать, чтобы его использовать. Или вы можете просто добавить:

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Это должно сделать порт доступным в более короткие сроки. В моем случае это сделало порт доступным практически сразу.

Ответ 7

У меня есть Raspberry Pi, и я использую веб-сервер Python (используя Flask). Я перепробовал все выше, единственное решение - закрыть терминал (оболочку) и открыть его снова. Или перезапустите Raspberry Pi, потому что ничто не останавливает этот веб-сервер...

Ответ 8

Простая однострочная команда, чтобы избавиться от нее, введите команду ниже в терминале,

ps -a

Это перечислит весь процесс, извлечение которого используется Python, и введите команду bellow в терминале,

kill -9 (processID) 

Например убить -9 33178

Ответ 9

На всякий случай вышеприведенные решения не сработали:

  1. Получите порт, который слушает ваш процесс:

    $ ps ax | grep python

  2. Убить процесс

    $ kill PROCESS_NAME