разъем.ошибка: [Errno 48] адрес уже используется
Я пытаюсь настроить сервер с python из Mac terminal.
Я перехожу к местоположению папки использование:
python -m SimpleHTTPServer
но это дает мне ошибку:
socket.error: [Errno 48] Address already in use
ранее я открывал соединение с помощью той же команды на другом сайте в другом месте в моей машине.
8 ответов
у вас уже есть процесс привязан к порту по умолчанию (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>
) вместо сигнала. См.Википедии для более подробной информации.
кроме того, запустите сервер на разные port, указав альтернативный порт в командной строке:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
затем получить доступ к серверу as http://localhost:8910
; где 8910
может быть любое число от 1024 и выше, если порт еще не занят.
использовать lsof-i: 5000 Это даст вам список процессов, использующих порт, если таковые имеются. После того, как список процессов задан, используйте идентификатор в столбце PID для завершения процесса: e.G убить 379
кстати, чтобы предотвратить это, в первую очередь, просто нажмите клавишу Ctrl+C в терминале, пока SimpleHTTPServer все еще работает нормально. Это" правильно " остановит сервер и освободит порт, чтобы вам не пришлось снова искать и убивать процесс перед перезапуском сервера.
(Mods: я пытался поставить этот комментарий на лучший ответ, где он принадлежит, но у меня недостаточно репутации.)
вы также можете служить на следующем по высоте доступном порту, делая что-то вроде этого в 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:
#!/usr/bin/env bash
MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}
(netstat -atn | awk '{printf "%s\n%s\n", , }' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1
настройте это как исполняемый файл с именем get-free-port
и вы можете сделать что-то вроде этого:
someprogram --port=$(get-free-port)
это не так надежно, как собственный подход Python, потому что скрипт bash не захватывает порт - другой процесс может захватить порт перед вашим процессом (условие гонки)-но все же может быть достаточно полезен при использовании утилиты, которая не имеет собственного подхода try-try-again.
Я новичок в Python, но после моего короткого исследования я обнаружил, что это типично для привязки сокетов. Так получилось, что сокет все еще используется, и вам, возможно, придется подождать, чтобы использовать его. Или, вы можете просто добавить:
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
это должно сделать порт доступным в течение более короткого времени. В моем случае это сделало порт доступным почти сразу.
У меня есть raspberry pi, и я использую веб-сервер python (используя колбу). Я пробовал все выше, единственное решение -закрыть терминал(корпус) и откройте его снова. Или перезапустите raspberry pi, потому что ничто не мешает, что вебсервер...
на всякий случай выше решения не работали:
-
получите порт, который прослушивает ваш процесс:
$ ps ax / grep python
-
убить процесс
$ kill PROCESS_NAME