Lyssnande port
Andra namn: öppna portar, vad använder port 3000, listening port
Kort svar
En lyssnande port är en nätverksport där en process väntar på inkommande anslutningar, till exempel en webbserver på port 3000. Bara en process i taget kan lyssna på en viss port och adress, och det är därför du ser fel som ”address already in use”.
Utvecklingsservrar, databaser och en del appar öppnar lyssnande portar. När du startar en server och den misslyckas för att porten är upptagen lyssnar en annan process fortfarande där, ofta en tidigare kopia av samma server.
Aktivitetskontroll kan visa vilka filer och portar en process har öppna, men det snabbaste sättet att hitta vilken process som äger en port är kommandot lsof i Terminal.
Så hittar du vad som använder en port
Kör lsof -nP -iTCP:3000 -sTCP:LISTEN i Terminal och byt ut 3000 mot din port. Utdata visar kommandonamnet och dess PID.
Om du vill lista alla lyssnande TCP-portar kör du lsof -nP -iTCP -sTCP:LISTEN. Lägg till sudo först för att ta med processer som ägs av andra användare.
Så frigör du en port
Om processen är en server som du själv har startat stoppar du den på vanligt sätt först, till exempel med kontroll-C i terminalen där den körs. Annars kör du kill <PID> med PID från lsof. Använd kill -9 <PID> bara om den inte avslutas.
Kontrollera processnamnet innan du stoppar den. Vissa portar tillhör tjänster i macOS, som AirPlay-mottagare, som lyssnar på portarna 5000 och 7000 i nyare versioner av macOS.
Så ser du portar i Aktivitetskontroll
Dubbelklicka på en process och öppna fliken Öppna filer och portar. Den listar filerna och nätverksanslutningarna som processen har öppna.
Så läser du utdata från lsof
Varje rad är en öppen socket. En server visar oftast två rader, en för IPv4 och en för IPv6, med samma PID.
- COMMAND är processnamnet, avkortat till 9 tecken som standard. Lägg till
+c 0för att se hela namnet:lsof +c 0 -nP -iTCP -sTCP:LISTEN. - PID är process-ID:t som du anger för
killellerps. - USER är kontot som kör processen. Processer som ägs av root hör oftast till macOS eller till en installerad tjänst.
- NAME visar adressen och porten.
*:3000betyder att servern tar emot anslutningar på alla nätverksgränssnitt.127.0.0.1:3000eller[::1]:3000betyder att bara den här datorn kan ansluta.
Så ser du vilket projekt en utvecklingsserver hör till
Processnamnet är ofta bara node, python eller ruby, vilket inte säger vilket projekt som körs. Två kommandon ger svaret.
- Hämta PID med
lsof -nP -iTCP:3000 -sTCP:LISTEN. - Kör
ps -o pid,ppid,command -p <PID>för att se hela kommandot som startade den. - Kör
lsof -a -p <PID> -d cwdför att se mappen som den körs i, vilket oftast är projektmappen. - Om PPID pekar på ett skal startades servern från ett terminalfönster. Stoppa den där med kontroll-C om fönstret fortfarande är öppet.
Varför porten är upptagen när ingenting verkar köras
Om porten tillhör AirPlay-mottagare kör du servern på en annan port, eller stänger av AirPlay-mottagare i Systeminställningar > Allmänt, i avsnittet AirDrop.
- En server från en tidigare session körs fortfarande i en terminalflik eller ett fönster som du har glömt.
- En server startades i bakgrunden, eller av en redigerare eller ett annat verktyg, och har inget synligt fönster.
- Servern kraschade men en underordnad process som den startade håller fortfarande porten.
- En tjänst i macOS använder samma port, som AirPlay-mottagare på portarna 5000 och 7000.
Kolumnen Portar i Aktivitetskontroll visar inte nätverksportar
Aktivitetskontroll har en valfri kolumn Portar på fliken Processor. Den räknar Mach-portar, en meddelandemekanism som macOS använder mellan processer, samma värde som top visar som portar. Den listar inte nätverksportar. För nätverksportar använder du lsof eller fliken Öppna filer och portar i infofönstret för en process.
Frågor som folk ställer
Hur ser jag vad som använder port 3000 på en Mac?
Kör lsof -nP -iTCP:3000 -sTCP:LISTEN i Terminal. Kommandot visar namnet och PID för processen som lyssnar på porten.
Hur dödar jag en process på en port på en Mac?
Hitta dess PID med lsof och kör sedan kill <PID>. Om den inte avslutas stoppar kill -9 <PID> den direkt.
Hur listar jag alla öppna portar på en Mac?
Kör lsof -nP -iTCP -sTCP:LISTEN för att lista lyssnande TCP-portar. Lägg till sudo för att ta med processer från andra användare.
Vad betyder ”address already in use”?
En annan process lyssnar redan på den porten och adressen. Hitta den med lsof -nP -iTCP:<port> -sTCP:LISTEN och stoppa den eller välj en annan port.
Varför visar lsof ingenting för en port som används?
Processen kan tillhöra en annan användare eller root. Kör samma kommando med sudo först för att ta med alla processer.
Är det säkert att döda det som ligger på port 5000 eller 7000?
Inte utan att kontrollera namnet. I nyare versioner av macOS används de portarna ofta av AirPlay-mottagare, som du i stället kan stänga av i Systeminställningar.
Relaterat
Steg för steg: Docker använder för mycket minne.
Letar du efter något bättre än Aktivitetskontroll? Läs om de bästa alternativen till Aktivitetskontroll för Mac, eller bläddra bland alla begrepp i ordlistan.