ports : lsof project-aware pour macOS
lsof -iTCP -sTCP:LISTEN -nP | grep :3000 — tout le monde connaît, personne ne s’en souvient vraiment. Et surtout, ça ne répond qu’à la moitié de la question : oui il y a quelque chose sur le port 3000, mais lequel de tes cinq process node ?
ports règle ça. Un binaire Go, zéro dépendance, macOS uniquement.
$ ports
PORT PROTO PID COMMAND PARENT PATH CAFFEINATE AGE
3000 TCP 15711 node zsh ~/code/web-app - 27m
3030 TCP 12405 node zsh ~/code/api on:82031 2h
5432 TCP 23514 ssh launchd ~/code/infra - 10dLe répertoire de projet est affiché directement. Plus besoin de croiser le PID avec ps aux.
Kill, pause, inspect — sans chercher le PID
# Libérer un port en une commande
ports kill 3000
# Ça n'a pas répondu ? Force.
ports force-kill 3000
# Tuer tout ce qui tourne sous un projet
ports kill --dir ~/code/web-app
# Geler sans tuer (pratique pour débugger)
ports pause 3000
ports resume 3000
# Inspecter avec probe HTTP
ports inspect 3000Le flag --dir est la commande que j’aurais voulu avoir depuis des années : éteindre tout ce qui tourne sous un projet en une ligne, sans chercher les PIDs un par un.
Ce qui change pour un workflow agent IA
Le Mac endort les process dès qu’il idle trop longtemps. Pour des sessions d’agents qui durent des heures, c’est un problème réel. ports caffeinate attache le mécanisme natif macOS directement sur le process qui t’intéresse.
# Garder actif ce qui écoute sur ce port
ports caffeinate 3000
# Garder actif un agent IA par nom
ports caffeinate codex
ports caffeinate "claude code"
# Suivre les nouveaux process enfants au fur et à mesure
ports caffeinate codex --dir ~/code/agent --follow
# Et pour retrouver les PIDs d'agents qui n'écoutent pas de port
ports --find codex "claude code" gemini cursor--follow est la feature clé pour les sessions longues : dès qu’un nouveau process enfant apparaît sous le projet, il est cafféiné automatiquement. Utile quand Claude Code respawn ses workers.
ports --json sort du JSON propre, pipeable dans jq. Pratique pour de l’automatisation ou intégrer ça dans un script de setup de projet.
Installation via Homebrew : brew install erdemylmaz/ports-cli/ports
Source : github.com/erdemylmaz/ports-cli