socket.error: [Errno 48] Adres al in gebruik

Ik probeer een server met python op te zetten vanaf mac terminal.

Ik navigeer naar de maplocatie en gebruik:

python -m SimpleHTTPServer

Maar dit geeft me een foutmelding:

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

Ik had eerder een verbinding geopend met hetzelfde commando
voor een andere website op een andere locatie in mijn computer.


Antwoord 1, autoriteit 100%

Je hebt al een proces gebonden aan de standaardpoort (8000). Als u dezelfde module al eerder hebt uitgevoerd, is het zeer waarschijnlijk dat dat proces nog steeds aan de poort is gebonden. Probeer eerst het andere proces te lokaliseren:

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

De opdrachtargumenten zijn inbegrepen, dus je kunt degene zien die SimpleHTTPServer draait als er meer dan één python-proces actief is. Misschien wil je testen of http://localhost:8000/ nog steeds een directorylijst voor lokale bestanden toont.

Het tweede nummer is het procesnummer; stop de server door een signaal te sturen:

kill 81651

Dit stuurt een standaard SIGTERM-signaal; als het proces niet reageert, moet u mogelijk zwaardere methoden gebruiken, zoals het verzenden van een SIGKILL (kill -s KILL <pid> of kill -9 <pid>) signaal in plaats daarvan. Zie Wikipedia voor meer details.

U kunt de server ook uitvoeren op een andere poort, door de alternatieve poort op de opdrachtregel op te geven:

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

ga vervolgens naar de server als http://localhost:8910; waarbij 8910 een willekeurig getal vanaf 1024 kan zijn, op voorwaarde dat de poort nog niet in gebruik is.


Antwoord 2, autoriteit 48%

Eenvoudige oplossing:

  1. Zoek het proces met poort 8080:
sudo lsof -i:8080
  1. Dood het proces op die poort:
kill $PID

PID wordt verkregen uit de uitvoer van stap 1.


Antwoord 3, autoriteit 11%

Gebruik

 sudo lsof -i:5000

Dit geeft u een lijst met processen die de poort gebruiken, indien aanwezig.
Zodra de lijst met processen is gegeven, gebruikt u de id in de PID-kolom om het procesgebruik te beëindigen

 kill 379 #use the provided PID

Antwoord 4, autoriteit 5%

Eenvoudig eenregelig commando om er vanaf te komen, typ het onderstaande commando in terminal,

ps -a

Dit geeft een overzicht van alle processen, checkout die worden gebruikt door Python en typ de opdracht balg in terminal,

kill -9 (processID) 

Bijvoorbeeld kill -9 33178


Antwoord 5, autoriteit 5%

Trouwens, om te voorkomen dat dit gebeurt, druk je gewoon op Ctrl+C in terminal terwijl SimpleHTTPServer nog steeds normaal werkt. Dit zal de server “juist” stoppen en de poort vrijgeven, zodat u het proces niet opnieuw hoeft te vinden en te beëindigen voordat u de server opnieuw opstart.

(Mods: ik heb geprobeerd deze opmerking bij het beste antwoord te plaatsen waar het hoort, maar ik heb niet genoeg reputatie.)


Antwoord 6, autoriteit 2%

Je kunt ook op de eerstvolgende beschikbare poort dienen door zoiets als dit te doen 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

Als je hetzelfde moet doen voor andere hulpprogramma’s, kan het handiger zijn als 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

Stel dat in als een uitvoerbaar bestand met de naam get-free-port en je kunt zoiets als dit doen:

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

Dat is niet zo betrouwbaar als de native Python-aanpak omdat het bash-script de poort niet vastlegt — een ander proces zou de poort kunnen pakken voordat jouw proces dat doet (raceconditie) — maar het kan nog steeds nuttig genoeg zijn bij het gebruik van een hulpprogramma dat heeft geen eigen probeer-probeer-aanpak.


Antwoord 7, autoriteit 2%

Je kunt de server toestaan ​​een adres opnieuw te gebruiken met allow_reuse_address.

Of de server het hergebruik van een adres toestaat. Dit is standaard False en kan in subklassen worden ingesteld om het beleid te wijzigen.

import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()

Antwoord 8

Ik ben nieuw in Python, maar na mijn korte onderzoek kwam ik erachter dat dit typisch is voor sockets die worden gebonden. Het kan gebeuren dat de socket nog steeds wordt gebruikt en dat u mogelijk moet wachten om hem te gebruiken. Of je kunt gewoon toevoegen:

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

Hierdoor zou de poort binnen een kortere tijd beschikbaar moeten zijn. In mijn geval maakte het de poort vrijwel onmiddellijk beschikbaar.


Antwoord 9

Voor het geval bovenstaande oplossingen niet werken:

  1. Haal de poort op waar uw proces naar luistert:

    $ ps axe | grep python

  2. Dood het proces

    $ kill PROCESS_NAME


Antwoord 10

Ik heb een raspberry pi en ik gebruik een python-webserver (met Flask). Ik heb alles hierboven geprobeerd, de enige oplossing is om de terminal(shell) te sluiten en opnieuw te openen. Of start de raspberry pi opnieuw, want niets houdt die webserver tegen…


Antwoord 11

Case met mij

Dit gebeurt wanneer ik een server debug of run en als ik klaar ben, in plaats van het proces beëindigen, Verbreek het.

PyCharm vraagt ​​om deze twee opties wanneer we deze proberen te sluiten terwijl de server nog draait

Hierdoor wordt het proces nog steeds op de achtergrond uitgevoerd op dat specifieke adres, vandaar de fout Address already in use.

Oplossing

pkill python

Werkt voor mij.

Een ander geval – meerdere processen

Als je meer dan één server/applicatie met python hebt draaien (uiteraard op verschillende poorten ??), haal dan de PID van dat proces op met behulp van PORT en kill het.

sudo lsof -i :5000 # here 5000 is the port number  
| COMMAND | PID    | USER     | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME                    |
|--------- | -------- | ---------- | ---- | ------ | -------- | ---------- | ------ | -------------------------|
| python  | 185339 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185348 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185350 | username | 8u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
kill -9 185339 # here 185339 is the PID from above output; keep the -9 as it is

Bekijk @Andrew‘s antwoord om dit in de toekomst te voorkomen.

Referenties: kill-commando, kill/pkill/killall, lsof

Namaste ??


Antwoord 12

Dit is een veelvoorkomende use case voor elke ontwikkelaar.

Het is beter om het als functie in uw lokale systeem te hebben. (Dus beter om dit script in een van de shell-profielen te houden, zoals ksh/zsh of bash-profiel op basis van de gebruikersvoorkeur)

function killport {
   kill -9 `lsof -i tcp:"$1" | grep LISTEN | awk '{print $2}'`
}

Gebruik:

killport port_number

Voorbeeld:

killport 8080

Antwoord 13

Toevoegen aan het antwoord van Michael Schmid
Had net het probleem, om het gebruik van de poort opnieuw te kunnen binden, moet de socketserver als volgt SUBCLASSEN:

from socketserver import TCPServer, BaseRequestHandler
from typing import Tuple, Callable
class MySockServer(TCPServer):
    def __init__(self, server_address: Tuple[str, int], RequestHandlerClass: Callable[..., BaseRequestHandler]):
        self.allow_reuse_address = True
        super().__init__(server_address, RequestHandlerClass)

omdat het na instantiëren geen zin heeft om die vlag te wijzigen.
Gebruik het dan in plaats van TCPServer of wat je ook gebruikt.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

fourteen + twelve =

Other episodes