Socketfout: adres al in gebruik

Ik heb een CherryPy-script dat ik regelmatig ren om een ​​server te starten. Vandaag hoefde ik het een paar keer te starten en te stoppen om wat bugs in een config-bestand op te lossen, en ik vermoed dat de socket niet helemaal gesloten was, want toen ik het opnieuw probeerde op te starten, kreeg ik dit probleem:

[23/Mar/2015:14:08:00] ENGINE Listening for SIGHUP.
[23/Mar/2015:14:08:00] ENGINE Listening for SIGTERM.
[23/Mar/2015:14:08:00] ENGINE Listening for SIGUSR1.
[23/Mar/2015:14:08:00] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.
[23/Mar/2015:14:08:00] ENGINE Started monitor thread 'Autoreloader'.
[23/Mar/2015:14:08:00] ENGINE Started monitor thread '_TimeoutMonitor'.
[23/Mar/2015:14:08:00] ENGINE Error in HTTP server: shutting down
Traceback (most recent call last):
  File "/home/andrew/virtualenvs/mikernels/lib/python2.7/site-packages/cherrypy/process/servers.py", line 188, in _start_http_thread
    self.httpserver.start()
  File "/home/andrew/virtualenvs/mikernels/lib/python2.7/site-packages/cherrypy/wsgiserver/wsgiserver2.py", line 1848, in start
    raise socket.error(msg)
error: No socket could be created

Ik bewerkte Cherry’s Wsgiserver2.py om de details van de socket.Error en error.strerrorwas

98  (98, 'Address already in use') Address already in use

Ondertussen is mijn socket geconstrueerd als:

af = 2
socktype = 1
proto = 6
canonname = ''
sa = ('0.0.0.0', 2112)
self.bind(af, socktype, proto)

(dat is geen exacte code, maar dat is wat de waarden zijn wanneer de fout is afgevuurd)

Ik heb netstat gecontroleerd en hoorde niets op poort 2112. Wat zou het probleem kunnen veroorzaken en hoe kan ik een diagnose stellen?

Bedankt!


Antwoord 1, autoriteit 100%

Je kunt het volgende proberen

from socket import *
sock=socket()
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# then bind

Uit de documenten:

De SO_REUSEADDR-vlag vertelt de kernel om een lokale socket in de TIME_WAIT-status opnieuw te gebruiken, zonder te wachten tot de natuurlijke time-out is verstreken.

Hier is de volledige uitleg:

Een voorbeeld meerdere keren uitvoeren met een te kleine vertraging tussen uitvoeringen, kan tot deze fout leiden:

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

Dit komt omdat de vorige uitvoering de socket in een TIME_WAIT-status heeft achtergelaten en niet onmiddellijk opnieuw kan worden gebruikt.

Er moet een socketvlag worden ingesteld om dit te voorkomen, socket.SO_REUSEADDR:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))

Antwoord 2, autoriteit 75%

Je zou het proces kunnen vinden en het killdoor het volgende te doen:

ps aux | grep python

, het proces-ID vinden en het handmatig stoppen door het volgende te doen:

sudo kill -9 PID

PID vervangen door uw PID.

Ik moet dit vaak doen tijdens het testen met Flask/CherryPy. Zou graag willen weten of er een eenvoudigere manier is (bijvoorbeeld om het in de eerste plaats te voorkomen)


Antwoord 3, autoriteit 60%

Veel gemakkelijker om het te doen door:

Controleer de PID(:5000 is de host sinds ik 127.0.0.1:5000 gebruik):
$ lsof -i :5000
Dood het dan:< br>$ sudo kill -9 PID

Other episodes