Pourquoi ai-je une erreur “Adresse déjà utilisée”?

je lance mon application flask, et ça marche bien, mais au moment où l’application est arrêtée et dans mon journal uwsgi

probably another instance of uWSGI is running on the same address (127.0.0.1:9002). bind(): Address already in use [core/socket.c line 764] 

quand je lance touch touch_reload, l’application fonctionne à nouveau. Je lance n’importe quoi d’autre sur le serveur qui peut prendre le socket.

ma conf:

 nginx server { listen 80; .... location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9001; } .... } server { listen 80; .... location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9003; } .... } uwsgi: chdir = /var/www/../ module = wsgihandler socket = 127.0.0.1:9003 wsgi-file = app/__init__.py callable = app master = true chmod-socket = 664 uid = root gid = root processes = 4 socket-timeout = 180 post-buffering = 8192 max-requests = 1000 buffer-size = 32768 logto = /var/www/.../log/uwsgi.log touch-reload = /var/www/.../touch_reload 

J’ai le même problème, mais le problème était en sqlalchemy, essayez d’append ceci:

 @app.teardown_request def shutdown_session(exception=None): from extension import db db.session.remove() 

Cette erreur signifie que le port 9002 est déjà utilisé par un autre processus. Selon vos journaux, ce processus est probably another instance of uWSGI is running on the same address (127.0.0.1:9002) uwsgi, probably another instance of uWSGI is running on the same address (127.0.0.1:9002) . Peut-être que le port n’a pas été libéré pendant que vous arrêtez l’application flask et que votre serveur wsgi est redémarré pendant que vous touch touch_reload . Vous pouvez essayer la commande suivante pour libérer le port.

 sudo fuser -k 9002/tcp 

Si c’est un processus TCP et redémarrez votre serveur wsgi pour voir si le port est déjà utilisé.

peut-être vous arrêtez uwsgi par crtl + z:

  1. trouver le pid du processus qui prend 8000

$ lsof -i: 8000

le résultat est peut-être:

 COMMAND PID USER FD TYPE ... uwsgi 9196 xxx 4u xxx ... 

puis

$ kill 9196

J’ai eu le même problème, et il s’est avéré que mon module principal commençait déjà l’application avec app.run() en charge.

Assurez-vous app.run() que app.run() est dans la section if __name__ == '__main__' .

FWIW, j’avais un problème similaire et j’ai découvert que j’utilisais uwsgi --http alors que j’aurais dû exécuter uwsgi --socket .

Fait intéressant, vous obtiendrez la même erreur Address already in use , même si vous travaillez avec des sockets.

  vvvvvvvvvvv-- Socket! error removing unix socket, unlink(): Permission denied [core/socket.c line 198] bind(): Address already in use [core/socket.c line 230] ^^^^^^^^^^^^^^^-- "Address" 

Si vous utilisez des sockets, voyez cette réponse .