Lexique/Quand quelque chose ne va pas

Port en écoute

Aussi : ports ouverts, ce qui utilise le port 3000

En bref

Un port en écoute est un port réseau sur lequel un processus attend des connexions entrantes, comme un serveur web sur le port 3000. Un seul processus peut écouter sur un port et une adresse donnés à la fois : c’est pour cela que vous voyez des erreurs comme « address already in use ».

Les serveurs de développement, les bases de données et certaines apps ouvrent des ports en écoute. Quand vous lancez un serveur et qu’il échoue parce que le port est pris, un autre processus y écoute encore, souvent une copie précédente du même serveur.

Le Moniteur d’activité peut afficher les fichiers et ports ouverts d’un processus, mais le moyen le plus rapide de trouver quel processus occupe un port est la commande lsof dans le Terminal.

Comment trouver ce qui utilise un port

Lancez lsof -nP -iTCP:3000 -sTCP:LISTEN dans le Terminal, en remplaçant 3000 par votre port. Le résultat affiche le nom de la commande et son PID.

Pour lister tous les ports TCP en écoute, lancez lsof -nP -iTCP -sTCP:LISTEN. Ajoutez sudo devant pour inclure les processus des autres utilisateurs.

Comment libérer un port

Si le processus est un serveur que vous avez lancé, arrêtez-le d’abord normalement, par exemple avec Contrôle + C dans le terminal où il tourne. Sinon, lancez kill <PID> avec le PID trouvé par lsof. N’utilisez kill -9 <PID> que s’il ne s’arrête pas.

Vérifiez le nom du processus avant de l’arrêter. Certains ports appartiennent à des services de macOS, comme Récepteur AirPlay, qui écoute sur les ports 5000 et 7000 dans les versions récentes de macOS.

Comment voir les ports dans le Moniteur d’activité

Double-cliquez sur un processus et ouvrez l’onglet Fichiers et ports ouverts. Il liste les fichiers et les connexions réseau que le processus a ouverts.

Comment lire le résultat de lsof

Chaque ligne est un socket ouvert. Un serveur affiche généralement deux lignes, une pour IPv4 et une pour IPv6, avec le même PID.

  • COMMAND est le nom du processus, coupé à 9 caractères par défaut. Ajoutez +c 0 pour voir le nom complet : lsof +c 0 -nP -iTCP -sTCP:LISTEN.
  • PID est l’identifiant du processus que vous passez à kill ou ps.
  • USER est le compte qui l’exécute. Les processus appartenant à root font généralement partie de macOS ou d’un service installé.
  • NAME indique l’adresse et le port. *:3000 signifie que le serveur accepte les connexions sur toutes les interfaces réseau. 127.0.0.1:3000 ou [::1]:3000 signifie que seul ce Mac peut s’y connecter.

Comment voir à quel projet appartient un serveur de dev

Le nom du processus est souvent juste node, python ou ruby, ce qui ne dit pas quel projet tourne. Deux commandes répondent à la question.

  1. Obtenez le PID avec lsof -nP -iTCP:3000 -sTCP:LISTEN.
  2. Lancez ps -o pid,ppid,command -p <PID> pour voir la commande complète qui l’a démarré.
  3. Lancez lsof -a -p <PID> -d cwd pour voir le dossier dans lequel il tourne, généralement le dossier du projet.
  4. Si le PPID désigne un shell, le serveur a été lancé depuis une fenêtre de terminal. Arrêtez-le là avec Contrôle + C si cette fenêtre est encore ouverte.

Pourquoi le port est pris alors que rien ne semble tourner

Si le port appartient à Récepteur AirPlay, lancez votre serveur sur un autre port, ou désactivez Récepteur AirPlay dans Réglages Système > Général, dans la section AirDrop.

  • Un serveur d’une session précédente tourne encore dans un onglet ou une fenêtre de terminal que vous avez oublié.
  • Un serveur a été lancé en arrière-plan, ou par un éditeur ou un autre outil, et n’a pas de fenêtre visible.
  • Le serveur a planté, mais un processus enfant qu’il avait lancé occupe encore le port.
  • Un service de macOS utilise le même port, comme Récepteur AirPlay sur les ports 5000 et 7000.

La colonne Ports du Moniteur d’activité ne concerne pas les ports réseau

Le Moniteur d’activité propose une colonne Ports facultative dans l’onglet Processeur. Elle compte les ports Mach, un mécanisme d’échange de messages que macOS utilise entre les processus, la même valeur que top affiche comme ports. Elle ne liste pas les ports réseau. Pour ceux-ci, utilisez lsof ou l’onglet Fichiers et ports ouverts dans la fenêtre d’informations d’un processus.

Questions fréquentes

Comment voir ce qui utilise le port 3000 sur Mac ?

Lancez lsof -nP -iTCP:3000 -sTCP:LISTEN dans le Terminal. La commande affiche le nom et le PID du processus qui écoute sur ce port.

Comment tuer le processus qui occupe un port sur Mac ?

Trouvez son PID avec lsof, puis lancez kill <PID>. S’il ne s’arrête pas, kill -9 <PID> l’arrête immédiatement.

Comment lister tous les ports ouverts sur Mac ?

Lancez lsof -nP -iTCP -sTCP:LISTEN pour lister les ports TCP en écoute. Ajoutez sudo pour inclure les processus des autres utilisateurs.

Que signifie « address already in use » ?

Un autre processus écoute déjà sur ce port et cette adresse. Trouvez-le avec lsof -nP -iTCP:<port> -sTCP:LISTEN, puis arrêtez-le ou choisissez un autre port.

Pourquoi lsof n’affiche rien pour un port pourtant utilisé ?

Le processus appartient peut-être à un autre utilisateur ou à root. Lancez la même commande avec sudo devant pour inclure tous les processus.

Est-ce sans risque de tuer ce qui occupe le port 5000 ou 7000 ?

Pas sans vérifier le nom. Dans les versions récentes de macOS, ces ports sont souvent utilisés par Récepteur AirPlay, que vous pouvez plutôt désactiver dans les Réglages Système.

Voir aussi

Pas à pas : Docker utilise trop de mémoire.

Vous cherchez mieux que le Moniteur d’activité ? Consultez les meilleures alternatives au Moniteur d’activité pour Mac, ou parcourez tous les termes du lexique.