web-dev-qa-db-fra.com

socket.error: [Errno 48] Adresse déjà utilisée

J'essaie de configurer un serveur avec Python à partir du terminal Mac. 

Je navigue vers l'emplacement du dossier pour une utilisation: 

python -m SimpleHTTPServer

Mais cela me donne une erreur: 

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

J'avais précédemment ouvert une connexion en utilisant la même commande Pour un site Web différent à un emplacement différent de ma machine.

154
irm

Vous avez déjà un processus lié au port par défaut (8000). Si vous avez déjà exécuté le même module auparavant, il est fort probable que ce processus reste lié au port. Essayez de localiser d’abord l’autre processus:

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

Les arguments de commande sont inclus, vous pouvez donc repérer celui qui exécute SimpleHTTPServer si plusieurs processus python sont actifs. Vous voudrez peut-être vérifier si http://localhost:8000/ affiche toujours une liste de répertoires pour les fichiers locaux.

Le deuxième numéro est le numéro de processus; arrêtez le serveur en lui envoyant un signal:

kill 81651

Cela envoie un signal SIGTERM standard; si le processus ne répond pas, vous devrez peut-être recourir à des méthodes plus rigoureuses, telles que l'envoi d'un signal SIGKILL (kill -s KILL <pid> ou kill -9 <pid>). Voir Wikipedia pour plus de détails .

Vous pouvez également exécuter le serveur sur un port différent en spécifiant le port de remplacement sur la ligne de commande:

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

puis accédez au serveur en tant que http://localhost:8910; où 8910 peut être n'importe quel nombre à partir de 1024, à condition que le port ne soit pas déjà utilisé.

288
Martijn Pieters

Solution simple:

  1. Trouvez le processus en utilisant le port 8080:

    Sudo lsof -i:8080

  2. Tue le:

    kill XXXX

95
Snail

Utilisation

 Sudo lsof -i:5000

Cela vous donnera une liste de processus utilisant le port, le cas échéant. Une fois que la liste des processus est fournie, utilisez l'ID de la colonne PID pour mettre fin au processus

 kill 379 #use the provided PID
16
candy_man

À propos, pour éviter que cela ne se produise, appuyez simplement sur Ctrl+C dans le terminal alors que SimpleHTTPServer fonctionne toujours normalement. Cela arrêtera "correctement" le serveur et libérera le port afin que vous n'ayez plus à rechercher et à tuer le processus avant de redémarrer le serveur.

(Mods: J'ai essayé de mettre ce commentaire sur la meilleure réponse, mais je n'ai pas assez de réputation.)

12
Mark Chapel

Vous pouvez également servir sur le port disponible suivant en faisant quelque chose comme ceci en 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

Si vous avez besoin de faire la même chose pour d'autres utilitaires, cela peut être plus pratique comme script 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

Définissez-le comme un exécutable avec le nom get-free-port et vous pouvez faire quelque chose comme ceci:

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

Cela n’est pas aussi fiable que l’approche Python native car le script bash ne capture pas le port - un autre processus pourrait le saisir avant votre processus (condition de concurrence) - mais peut néanmoins être suffisamment utile lorsqu’un utilitaire qui ne fonctionne t avoir une approche d’essayer encore une fois.

6
Chris Johnson

Je suis nouveau sur Python, mais après une brève recherche, j'ai découvert que c'était typique des sockets liés. Il se trouve que le socket est toujours utilisé et que vous devrez peut-être attendre pour l'utiliser. Ou, vous pouvez simplement ajouter:

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

Cela devrait rendre le port disponible dans un délai plus court. Dans mon cas, cela a rendu le port disponible presque immédiatement. 

4
PoisonIvee

Commande simple en une ligne pour s'en débarrasser, tapez ci-dessous la commande dans le terminal,

ps -a

Ceci listera tous les processus, la caisse utilisée par Python et la commande type ci-dessous dans le terminal,

kill -9 (processID) 

Par exemple, kill -9 33178

1
Aditya Malviya

J'ai un Raspberry Pi et j'utilise un serveur Web Python (en utilisant Flask). J'ai tout essayé ci-dessus, la seule solution est de fermer le terminal (Shell) et l'ouvrir à nouveau. Ou redémarrez le Raspberry Pi , car rien n'arrête ce serveur web ...

1
Thiago Farias

Juste au cas où les solutions ci-dessus ne fonctionneraient pas:

  1. Obtenez le port que votre processus écoute:

    $ ps ax | grep python

  2. Tuez le processus

    $ kill PROCESS_NAME

0
user3305074