socket.error: [Errno 48] Адреса вже використовується


224

Я намагаюся налаштувати сервер з python від mac терміналу.

Я переходжу до місця використання папки:

python -m SimpleHTTPServer

Але це дає мені помилку:

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

Раніше я відкрив з'єднання, використовуючи ту саму команду для іншого веб-сайту в іншому місці моєї машини.


2
Вбийте інший процес або запустіть цей інший порт:python -m SimpleHTTPServer 8081
Blender

Відповіді:


356

У вас уже є процес, прив’язаний до порту за замовчуванням (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>) сигнал. Детальнішу інформацію див. У Вікіпедії .

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

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

потім перейдіть до сервера як http://localhost:8910; де 8910може бути будь-яке число від 1024 і вище, за умови, що порт вже не прийнятий.


Яку URL-адресу я повинен мати в браузері, щоб перевірити, чи працює вона? Я бігаю по іншому порту, як ви пробували
irm

14
можливо, потрібно буде скористатисяsudo kill -9 PID
Danpe

Дякую, @Danpe, я спробував "sudo kill PID", який не працював, але "sudo kill -9 PID" вбив процес. Хтось знає, що -9 вказує? Навіть посібник з судо,
seokhoonlee

3
@seokhoonlee: killнадсилає сигнал процесу, з яким він може вирішити обробляти (наприклад, витончено вимкнути або обернути файл журналу). Ці сигнали є цілими числами (кожне з ім'ям), за замовчуванням - 15, означають TERMабо припиняють . Використовуючи -9 посилає сигнал 9, KILLякий процес не може впіймати і проігнорувати, і ОС закінчить процес тим, хто йому подобається чи ні.
Martijn Pieters

@seokhoonlee: також дивіться статтю про сигнал Unix у Вікіпедії.
Martijn Pieters

153

Просте рішення:

  1. Знайдіть процес за допомогою порту 8080:

    sudo lsof -i:8080

  2. Вбий це:

    kill XXXX


8
Ця відповідь отримає користь із прикладу того, як lsofможе виглядати вихідний результат, і як знайти ідентифікатор процесу (список "XXXX", який ви перераховуєте) в рамках виводу. Для тих, хто бачить це без цієї інформації, це друге поле у ​​висновку, під заголовком "PID".
lindes

2
@lindes Ти тріщина!
Карлос Родрігес

@ CarlosRodríguez: так? Я справді не знаю, що ви маєте на увазі під цим коментарем (я знаю кілька визначень "тріщини", а ті, які я знаю, не здаються ... "
lindes

2
@ CarlosRodríguez Я хочу вірити, що він знайшов вашу відповідь абсолютно актуальною. Я думаю, що ваші спостереження щодо необхідності давати вибірки виходу lsof та як визначити PID є дуже важливими. Другий елемент у кожному поверненому рядку, як правило, є PID, він завжди знаходиться під стовпцем PID виводу
Kudehinbu Oluwaponle

32

Використовуйте

 sudo lsof -i:5000

Це дасть вам список процесів за допомогою порту, якщо такі є. Після того, як буде надано список процесів, використовуйте ідентифікатор у стовпці PID, щоб припинити використання процесу

 kill 379 #use the provided PID

Це ідеально, особливо тих , хто працює на MAC OSX , і не використовувати SO_REUSEPORT замість SO_REUSEADDR
ЗСШ

16

До речі, щоб уникнути цього в першу чергу, просто натисніть Ctrl+ Cу терміналі, поки SimpleHTTPServer все ще працює нормально. Це "належним чином" зупинить сервер і звільнить порт, тому вам не доведеться знову і вбивати процес перед перезавантаженням сервера.

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


12

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

ps -a

Тут буде перераховано весь процес, замовлення якого використовується Python і введіть нижче команду в терміналі,

kill -9 (processID) 

Наприклад, вбити -9 33178


7

Ви також можете подавати наступний найвищий доступний порт, роблячи щось подібне на 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", $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 не захоплює порт - інший процес може захопити порт до того, як ваш процес (стан гонки) - але все-таки може бути досить корисним при використанні утиліти, яка не робить ' не мати власний підхід.


6

Я новачок у Python, але після свого короткого дослідження я з’ясував, що це характерно для прив’язки розеток. Так буває, що розетка все ще використовується, і вам, можливо, доведеться почекати, щоб використовувати її. Або ви можете просто додати:

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

Це повинно зробити порт доступним за коротший час. У моєму випадку, порт зробив доступним майже одразу.


4

На випадок, якщо вищезгадані рішення не спрацювали:

  1. Отримайте порт, який слухає ваш процес:

    $ ps сокира | греп пітон

  2. Вбийте процес

    $ kill PROCESS_NAME


3

У мене є малиновий пі, і я використовую веб-сервер python (за допомогою Flask). Я спробував усе вище, єдине рішення - закрити термінал (оболонку) і знову відкрити його. Або перезавантажте малиновий пі , тому що цей веб-сервер нічим не зупиняє ...


2

Ви можете дозволити серверу повторно використовувати адресу allow_reuse_address.

Чи дозволить сервер повторне використання адреси. Це за замовчуванням Falseі може бути встановлено в підкласах для зміни політики.

import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.