Si un serveur de développement local indique qu'un port est déjà utilisé, utilisez la commande intégrée lsof de macOS pour trouver le processus qui écoute sur ce port TCP. Dans Terminal, exécutez lsof avec le numéro de port et un filtre d'état d'écoute, puis utilisez le PID renvoyé pour inspecter le processus avant de décider de l'arrêter ou non.

Trouver le processus qui écoute sur un port TCP

Ouvrez Terminal et remplacez 3000 par le port indiqué dans le message d'erreur. Saisissez la commande telle quelle ; le nombre étant en texte brut, aucun caractère d'échappement pour le shell n'est nécessaire.

lsof -nP -iTCP:3000 -sTCP:LISTEN

lsof répertorie les fichiers ouverts par les processus, y compris les sockets Internet. Ici, -iTCP:3000 sélectionne les connexions TCP pour ce port, et -sTCP:LISTEN restreint les résultats aux sockets en attente de connexions. -nP demande à lsof d'afficher les adresses et numéros de port sous forme numérique plutôt que de résoudre les noms, ce qui facilite la comparaison avec le port recherché. Ces options sont documentées dans le manuel open source de lsof pour macOS d'Apple. Manuel lsof pour macOS d’Apple

Le résultat peut se présenter ainsi ; les noms et les numéros sont donnés à titre d'exemple et ne proviennent pas d'un Mac particulier :

COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     8421 sam    21u  IPv6 ...          0t0    TCP *:3000 (LISTEN)

Considérez COMMAND comme le nom du processus et PID comme son identifiant de processus. Le champ NAME indique l'adresse locale et le port. *:3000 indique une adresse générique (wildcard), tandis que localhost:3000 ou une adresse de bouclage numérique indique une liaison de bouclage (loopback). Une écoute générique peut accepter des connexions adressées à plusieurs interfaces locales ; elle n'indique pas à elle seule que le service est accessible depuis Internet. Le filtre d'écoute est utile car un processus peut également avoir des connexions clientes ordinaires impliquant ce même port.

Vérifier à quoi appartient le PID

Utilisez le PID issu du résultat pour demander plus de détails à la liste des processus de macOS. Remplacez 8421 par le PID obtenu :

ps -p 8421 -o pid=,ppid=,user=,command=

Cela affiche le PID du processus, le PID du processus parent, le nom du compte et la ligne de commande. La ligne de commande peut vous aider à déterminer si l'écoute provient d'un serveur de développement, d'un environnement d'exécution (runtime) ou d'une autre application. Une valeur COMMAND courte dans lsof ne suffit pas toujours à identifier le projet ou l'application qui l'a lancé ; comparez donc la sortie plus complète de ps avec l'onglet de Terminal ou l'application dont vous pensez qu'elle possède le serveur.

Si lsof ne renvoie aucune ligne, vérifiez que le numéro de port est correct et que l'application est toujours en cours d'exécution. Le serveur a peut-être été arrêté, utilise peut-être UDP au lieu de TCP, ou n'a peut-être pas encore ouvert son socket d'écoute. Pour inspecter les sockets UDP sur ce port, exécutez :

lsof -nP -iUDP:3000

UDP n'utilise pas l'état LISTEN de TCP, n'ajoutez donc pas -sTCP:LISTEN à cette requête. Si un résultat apparaît, utilisez COMMAND et PID comme indices, puis inspectez ce PID avec ps comme indiqué ci-dessus.

Si la commande n'affiche aucun résultat ou une erreur de permission

Un processus s'exécutant sous un autre compte peut ne pas être visible pour votre utilisateur actuel. Si vous recevez un message lié aux permissions ou si vous pensez qu'un autre utilisateur est propriétaire du socket, réexécutez la requête TCP avec les privilèges d'administrateur :

sudo lsof -nP -iTCP:3000 -sTCP:LISTEN

Terminal vous demandera le mot de passe de votre compte Mac. Lorsque vous le saisissez, les caractères n'apparaissent généralement pas ; appuyez sur Entrée une fois la saisie terminée. Utilisez l'accès administrateur pour examiner le résultat, puis identifiez l'application propriétaire avant d'intervenir. Si la commande n'affiche toujours rien, réessayez au moment même où le conflit de port se produit : l'état du processus peut changer entre l'apparition de l'erreur et la recherche.

Arrêter la bonne application

Trouver un PID permet d'identifier un processus ; cela ne vous dit pas si vous pouvez l'arrêter sans danger. Si vous reconnaissez le propriétaire, arrêtez le serveur depuis l'application ou la session de Terminal qui l'a démarré, puis relancez votre commande initiale. Cela permet à l'application de s'arrêter correctement. Si vous n'arrivez pas à déterminer ce qui a lancé le processus, inspectez d'abord la ligne de commande ou le PID parent plutôt que de mettre fin à un processus système ou d'arrière-plan inconnu. lsof signale qui utilise actuellement le socket ; il n'explique pas pourquoi une application s'est lancée ni quelle configuration de projet a sélectionné ce port.

Pour obtenir des informations détaillées sur les commandes pour votre version installée de macOS, Terminal peut afficher le manuel local avec man lsof ; appuyez sur q pour quitter. Le guide de Terminal d'Apple explique comment utiliser man pour consulter la documentation des commandes. Prise en main de Terminal sur Mac

Sources