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
Простое решение:
Ответ 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
На всякий случай вышеприведенные решения не сработали:
-
Получите порт, который слушает ваш процесс:
$ ps ax | grep python
-
Убить процесс
$ kill PROCESS_NAME