Jak przestać szukać procesów przez lsof i uporządkować porty
Znana sytuacja: uruchamiasz lokalny serwer, a terminal wypluwa bolesnie znajomy błąd Error: listen EADDRINUSE: address already in use :::3000. Wczorajszy proces roboczy nie zakończył się prawidłowo, jakiś proces w tle się zawiesił lub kontener Dockera cicho trzyma wymagane gniazdo.

Zwykle w tym miejscu zaczyna się rutyna. Otwierasz terminal, przypominasz sobie składnię lsof -i :3000 w systemie macOS lub polecenie grep netstat -ano w Windows, kopiujesz PID i wpisujesz kill -9. Jeśli masz tuzin mikroserwisów, terminal zamienia się w cmentarz powtarzalnych poleceń.
Projekt PortPal rozwiązuje ten mały, ale uporczywy problem. To lekki pulpit desktopowy, który wyświetla zajęte porty, identyfikuje stos technologiczny i zabija zbędne procesy jednym przyciskiem.
Co kryje się pod maską i dlaczego tego potrzebujesz
Większość podobnych narzędzi to albo prymitywne nakładki na polecenia systemowe, albo ciągną za sobą ciężkie Electron, zużywające gigabajt pamięci RAM tylko po to, by wyświetlić pięciowierszową listę.
Twórcy PortPala wybrali przyjemniejszą ścieżkę i zbudowali aplikację w oparciu o Tauri 2, Rust i React 19. Dzięki Rust backend minimalnie obciąża CPU w tle, a natywne okno otwiera się natychmiast.
Narzędzie rozwiązuje kilka codziennych zadań:
- Znajduje zawieszone lokalne porty i wyodrębnia metadane procesu.
- Rozpoznaje środowisko na podstawie kontekstu plików i domyślnych portów.
- Pomaga wymusić zatrzymanie procesu lub go ponownie uruchomić.
- Wizualizuje połączenia sieciowe między usługami jako graf.
Kluczowe funkcje
Rozpoznawanie projektów zamiast suchych liczb
Zwykły monitor systemowy powie ci tylko PID i nazwę pliku binarnego (na przykład node lub python). Jeśli działa pięć różnych projektów Node.js, rozróżnienie ich na podstawie danych wyjściowych terminala jest niemożliwe.
PortPal działa mądrzej. Nie tylko sprawdza numer gniazda, ale także skanuje katalogi robocze. Program szuka plików manifestu (package.json, Cargo.toml, go.mod) i dopasowuje numer portu do popularnych środowisk programistycznych:
W rezultacie panel wyświetla przejrzyste karty: od razu widać, że frontend działa na porcie 5173, a baza danych nasłuchuje na 5432.
Interaktywna mapa połączeń
Najciekawszym szczegółem interfejsu jest mapa topologiczna zbudowana przy użyciu biblioteki D3.js.

Zamiast płaskiej tabeli otrzymujesz symulację fizyczną z węzłami. Węzły są kolorowane według technologii: niebieski dla baz danych, fioletowy dla bundlerów Vite, zielony dla backendu Node.js. Węzły można przeciągać po ekranie, przybliżać kółkiem myszy, a aktywne połączenia sieciowe można badać w czasie rzeczywistym. Jeśli tworzysz system z wieloma mikroserwisami, taki graf pomaga szybko zrozumieć, kto aktualnie utrzymuje połączenie z kim.
Zarządzanie jednym kliknięciem i przycisk awaryjny
Obok każdego procesu znajduje się przycisk zakończenia. Kliknięcie krzyżyka — proces kończy się natychmiast, gniazdo zostaje zwolnione.
Jeśli port jest zajęty przez rozbity skrypt, który PortPal zapamiętał, w pobliżu pozostaje przycisk ponownego uruchomienia. Uruchamia polecenie ponownie w osobnym terminalu.
W interfejsie porty są podzielone na dwie grupy: procesy deweloperskie i usługi systemowe. Przypadkowe zabicie usługi systemowej jest trudniejsze. A gdy skończysz pracę na dzień i chcesz zamknąć całe zoo działających lokalnych serwerów naraz, jest przycisk Kill All dla grupy Dev Frameworks.
Praca w tle i zasobnik systemowy
PortPal minimalizuje się do obszaru powiadomień. Ikona w zasobniku zmienia kolor w zależności od obecności konfliktów portów. Gdy okno jest zamknięte, wątek w tle rejestruje zdarzenia: kiedy pojawił się nowy proces, które gniazdo zostało zwolnione i gdzie wystąpił skok ruchu. Historia ze wszystkimi znacznikami czasu jest przechowywana na osobnej karcie dzienników.
Architektura i stos technologiczny
Stos technologiczny projektu wygląda nowocześnie:
Rezygnując z ciężkich bibliotek komponentów frontendowych i używając natywnego Webview, aplikacja jest lekka i zużywa minimalne zasoby podczas ciągłego skanowania gniazd.
Jak uruchomić
Twórcy publikują gotowe kompilacje na stronie wydań repozytorium:
- Dla Windows dostępne są wersje
.msii.exe. - Dla macOS przygotowano kompilacje
.dmgdla chipów Apple Silicon i procesorów Intel. - Dla Linuksa dostępne są pakiety
.debi uniwersalny format.AppImage.
Jeśli chcesz zbudować narzędzie ze źródeł lub dodać własne reguły wykrywania, potrzebujesz Rust w wersji 1.70 lub nowszej oraz Node.js 18+:
W trybie deweloperskim działa gorące przeładowywanie komponentów React przez Vite równolegle z kompilacją części Rust.
Osobiste wrażenia
Projekt jest młody, aktualnie w wersji 0.2, ale już wygląda jak gotowe do użycia codzienne narzędzie. Podstawowa tabela portów i karty działają szybko. Mapa D3.js początkowo wydaje się dekoracją, ale podczas jednoczesnego debugowania bramy API, bazy danych i kilku klientów okazuje się naprawdę pomocna.
Men sze niedociągnięcia obejmują ograniczoną bazę danych automatycznego rozpoznawania frameworków. Jeśli uruchamiasz niestandardową usługę na niestandardowym porcie, takim jak 9231, PortPal wyświetli ją jako zwykły proces, dopóki ręcznie nie powiążesz kontekstu. Jednak ponieważ projekt jest open source na licencji MIT, dodanie do listy sygnatur w kodzie jest proste.
Kto go znajdzie przydatny: programiści webowi, inżynierowie full-stack i wszyscy, którzy regularnie zarządzają tuzinem lokalnych mikroserwisów i są zmęczeni zapamiętywaniem poleceń czyszczenia gniazd.
Powiązane projekty