Trova (e uccidi) la porta di blocco del processo 3000 su Mac


1813

Come posso trovare (e uccidere) i processi che ascoltano / usano le mie porte tcp? Sono su mac os x.

A volte, dopo un arresto anomalo o un bug, la mia app rails blocca la porta 3000. Non riesco a trovarla usando ps -ef ...

Quando si fa

rails server

ottengo

Indirizzo già in uso - bind (2) (Errno :: EADDRINUSE)

Aggiornamento 2014:

Per completare alcune delle risposte di seguito: Dopo aver eseguito i comandi kill, potrebbe essere necessario eliminare il file pid rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
Una soluzione molto semplice per terminare un processo su QUALSIASI porta specificata dall'utente può essere trovata nella risposta di @Kevin Suttle di seguito. Riprodotto qui per i posteri:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584

4
Port 3000 non è "specifico per lo sviluppo di rotaie" - Meteor funziona nativamente anche su 3000, e sono sicuro che ce ne sono altri.
Gregorvand,

Il commento di @ user456584 sopra dovrebbe essere la risposta accettata ^^^ Quella funzione ha funzionato per uccidere i molti processi che avevo in esecuzione su una porta
Aneuway

Risposte:


3029
  1. Puoi provare netstat

    netstat -vanp tcp | grep 3000
    
  2. Per macOS El Capitan e successivi (o se netstat non supporta -p), utilizzarelsof

    sudo lsof -i tcp:3000 
    
  3. Per Centos 7 utilizzare

    netstat -vanp --tcp | grep 3000
    

22
Grazie! La tua risposta ha dato vita al mio script "death_to 'port". (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1

192
Il flag "terse" su lsof produce un output adatto per il piping di un successivo kill: lsof -t -i tcp:1234 | xargs kill
Manav

6
L'ho inserito nel mio ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillquindi ora devo solo scrivere killport 8080e mi fa risparmiare qualche secondo
Alfonso Pérez

3
Un altro consiglio: assicurati di provare sudoprima di lsof se non vedi alcun output
Abe Petrillo

4
Un altro suggerimento è quello di aggiungere -Pal lsofcomando in modo che la porta raw sia visibile nell'output:lsof -P -i:3000
Jason Axelson,

1876

Trova:

sudo lsof -i :3000

Uccidere:

kill -9 <PID>

61
A volte lsof -i: port non mostrerà nulla. prova sudo lsof -i: port .
kilik52,

31
Consiglia di provare kill -15 <PID>prima di ricorrere alla -9sicurezza.
Jamon Holmgren,

7
@Jamon Holmgren perché? cosa fanno entrambi? e perché kill <PID>non è sufficiente / pericoloso / incompleto?
Michael Trouw,

13
@MichaelTrouw quasi un anno dopo, ma ecco la tua risposta. :-) unix.stackexchange.com/a/8918 TL; DR kill -15offre al processo la possibilità di ripulire dopo se stesso.
Jamon Holmgren,

9
Penso che questa risposta dovrebbe dire cosa -9fa.
Joseph Fraley,

207

Niente sopra ha funzionato per me. Qualcun altro con la mia esperienza potrebbe provare quanto segue (ha funzionato per me):

Correre:

lsof -i :3000 (where 3000 is your current port in use)

quindi controllare lo stato del PID riportato:

ps ax | grep <PID>

infine "begone with it":

kill -QUIT <PID>

18
Questa in realtà sembra una risposta migliore di quella data molto più tardi da Filip Spiridonov, che ha 277 voti contro il tuo 9. Il tuo era 6 mesi prima e ha le stesse informazioni con un po 'più di spiegazione. Non c'è giustizia ...
Floris,

Prova kill -TERM(o solo kill) prima kill -QUIT. Non tutti i processi eseguiranno un arresto ordinato su SIGQUIT.
craig65535,

160

Un one-liner per estrarre il PID del processo usando la porta 3000 e ucciderlo.

lsof -ti:3000 | xargs kill

Il flag -t rimuove tutto tranne il PID dall'output di lsof, rendendo facile ucciderlo.


13
Puoi filtrare le porte di "ascolto" con:lsof -ti:3000 -sTCP:LISTEN
Zlemini,

1
Questo metodo funziona meglio per me. Una semplice fodera che cancella la porta occupata. Grazie!
Ryan Trainor,

139

La soluzione più semplice :

Per porta singola:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Uccidi più porte con il comando a riga singola:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (ID processo / PID)

lsof -ti: 3001

82499

lsof -ti: 3001.3000

82499 82500

kill $ (lsof -ti: 3001,3000)

Termina i processi 82499 e 82500 in un unico comando.

Per usare questo negli package.jsonscript:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }


2
Questo ha funzionato per me Grazie :)
DILEEP THOMAS il

2
Sono contento che abbia aiutato.
Abhijith Sasikumar,

113

Questa singola riga di comando è facile da ricordare:

npx kill-port 3000

Per uno strumento più potente con la ricerca:

npx fkill-cli


PS: usano pacchetti javascript di terze parti. npxviene integrato con Node.js.

Fonti: tweet | github


Puoi condividere i dettagli sull'installazione di npx usando brew? Ho provato a installarlo sul mio Mac High Sierra, 10.13.3 e non funzionerà.
realPK,

@realPK npxdotato npmche viene con node.js, quindi non è un pacchetto separato. Aggiorna semplicemente il tuo node.js e le tue versioni di npm.
Bruno Lemos,

Faccio principalmente Java, non mi sono ancora esposto a Node. Ho trovato un modo diverso di uccidere il servizio in esecuzione sulla porta. TY per rispondere.
realPK

5
La necessità per NodeJS e JavaScript di uccidere qualcosa in esecuzione sulla porta 3000 probabilmente rotaie ... mi sembra troppo sovraccarico. aggiungere una semplice riga al tuo .bashrc o .zshrc con un alias lo risolverebbe senza la necessità di Internet. alias kill3000 = 'lsof -ti: 3000 | xargs kill 'quindi puoi fare: kill3000
Khalil Gharbaoui

La migliore soluzione a questo problema ... grazie
Re Rayhan,

107

È possibile utilizzare lsof -i:3000.

Questo è "Elenco file aperti". Questo ti dà un elenco dei processi e quali file e porte usano.


Sono su 10.5 lepard (Q aggiornata). Non so se sia importante qui, ma lsof non visualizza le porte. lsof -h (lsof 4.78) è troppo criptico anche io ...
oma

1
Hmm. Non lo so per certo su Leopard, ma prova ( come root - questo è importante, penso) lsof -i:3000.
Matt Gibson,

59

Nel tuo .bash_profile, crea un collegamento per terminateil processo 3000:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Quindi, chiama $terminatese è bloccato.


12
Puoi renderlo abbastanza flessibile per qualsiasi porta: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle il

E un nome così descrittivo = p
Michael Peterson,

Ho qualcosa di simile a questo ma passo nel porto. Ho chiamato la mia funzione KP per kill port.
Joseph Chambers,

58

Per terminare forzatamente un processo del genere, utilizzare il seguente comando

lsof -n -i4TCP:3000 

Dove 3000 è il numero di porta in cui è in esecuzione il processo

questo restituisce l'id di processo (PID) ed esegui

kill -9 "PID"

Sostituisci PID con il numero che ottieni dopo aver eseguito il primo comando

Ad esempio, se voglio terminare il processo in esecuzione sulla porta 8080


38
lsof -P | grep ':3000' | awk '{print $2}'

Questo ti darà solo il pid, testato su MacOS.


10
su MAC uccide tutti i pid sulla porta 3000: lsof -P | grep ': 3000' | awk '{print $ 2}' | xargs kill -9
mike clagg

1
più di un processo può ascoltare la stessa porta?
Kris,

La nostra app rotaie genera lavoratori che sono processi figlio, e devo usarlo per uccidere i lavoratori orfani
mike clagg

2
questo uccide anche i browser web che si collegano al porto
fjsj,

5
Eccone uno funzionante:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob

29

Eseguire nella riga di comando su OS-X El Captain:

kill -kill `lsof -t -i tcp:3000`

L'opzione terse di lsof restituisce solo il PID.


28

Uno dei modi per terminare un processo su una porta è usare la libreria python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Una volta installato, semplicemente:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

7
Questo è di gran lunga NON il modo più semplice. Le risposte votate non richiedono di scaricare e installare nulla.
Greg Pasquariello,

4
Quando vengono soddisfatti i prerequisiti, questo è così semplice e facile da ricordare. Abbiamo una diversa definizione di "più semplice" e questa risposta è perfettamente valida e appropriata. Forse mancano solo le istruzioni per installare Freeport con pip.
Cyril Duchon-Doris,

sotto il cofano, il porto franco è solo un involucro che chiama lsof -t -i:3000... sembra inutile.
Corey Goldberg,

Questa soluzione non è la più semplice, ma è conforme al 100% a ciò che l'OP ha chiesto ... Quindi è in atto AF valido
danielrvt

26

Per visualizzare i processi che bloccano la porta:

netstat -vanp tcp | grep 3000

Per uccidere i processi che bloccano la porta:

kill $(lsof -t -i :3000)


Questo non funziona su un computer Mac, restituisce quanto segue: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Funzionerà, tuttavia, nella maggior parte delle distribuzioni Linux
Milan Velebit

1
@MilanVelebit In realtà funziona perfettamente sul mio computer Mac (Sierra). Funziona bene se la tua porta 3000è occupata. Tuttavia, se nessun processo blocca la porta, si otterrà un kill: not enough argumentserrore.
Henry,

È strano, ho due Mac (entrambi High Sierra tho), ricordo di aver eseguito quei comandi su entrambi (vecchie abitudini) e so per certo che non funzionano. L'ho appena provato di nuovo sulla mia macchina, sapendo che la porta è occupata, stesso errore. : /
Milan Velebit

Hai un PID valido in esecuzione netstat -vanp tcp | grep 3000, per la tua porta occupata?
Henry,

1
L'ho provato in entrambi bashe zshshell. Funziona bene per me. Non sono sicuro del perché non funzioni per te. Potrebbe esserci qualcosa con High Sierra? Non ne ho idea: /
Henry,

24

Trova la connessione aperta

lsof -i -P | grep -i "ascolta"

Uccidi per ID processo

uccidere -9 'PID'


20

Trova e uccidi:

Questa singola riga di comando è semplice e funziona correttamente.

kill -9 $(lsof -ti tcp:3000)

14

Possibili modi per raggiungere questo obiettivo:

superiore

Il comando principale è il modo tradizionale di visualizzare l'utilizzo delle risorse del sistema e vedere i processi che stanno occupando la maggior parte delle risorse di sistema. In alto viene visualizzato un elenco di processi, con quelli che utilizzano la maggior parte della CPU in alto.

ps

Il comando ps elenca i processi in esecuzione. Il seguente comando elenca tutti i processi in esecuzione sul sistema:

ps -A

È inoltre possibile reindirizzare l'output tramite grep per cercare un processo specifico senza utilizzare altri comandi. Il seguente comando cercherà il processo di Firefox:

ps -A | grep firefox

Il modo più comune di trasmettere segnali a un programma è con il comando kill.

kill PID_of_target_process

lsof

Elenco di tutti i file aperti e dei processi che li hanno aperti.

lsof -i -P | grep -i "listen"
kill -9 PID

o

 lsof -i tcp:3000 

10

lsof -i tcp:port_number - elencherà il processo in esecuzione su quella porta

kill -9 PID - ucciderà il processo

nel tuo caso, lo sarà

lsof -i tcp:3000 dal tuo terminale trova il PID del processo

kill -9 PID


10

Questi due comandi ti aiuteranno a trovare e terminare il processo del server

  1. lsof -wni tcp: 3000
  2. uccidi -9 pid

Piacere mio, Aashiah
Saif chaudhry,

5

Aggiungi a ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

Quindi, source ~/.bash_profilecorri

killTcpListen 8080



4

TL; DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Se ti trovi in ​​una situazione in cui ci sono client e server che utilizzano la porta, ad esempio:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

allora probabilmente non vorrai uccidere entrambi.

In questa situazione puoi usare -sTCP:LISTENsolo per mostrare il pid dei processi che stanno ascoltando. Combinando questo con il -tformato terse è possibile terminare automaticamente il processo:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

Ho fatto una piccola funzione per questo, aggiungerlo al file rc ( .bashrc, .zshrco qualsiasi altra cosa)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

allora puoi semplicemente digitare kill-by-port 3000 per uccidere il tuo server rails (sostituendo 3000 per qualunque porta sia in esecuzione)

in caso contrario, è sempre possibile digitare kill -9 $(cat tmp/pids/server.pid)dalla directory principale delle rotaie


Ho dovuto eseguire il backslash \$PORTper visualizzare correttamente il messaggio. Altrimenti, funziona alla grande!
Ashwood,

4

Per uccidere più porte.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

Spero che questo aiuto!


1

Dovresti provare questo, questa tecnica è indipendente dal sistema operativo.

A lato della tua applicazione c'è una cartella chiamata tmp, all'interno della quale c'è un'altra cartella chiamata pids. Tale file contiene il file pid del server. Elimina semplicemente quel file. la porta si uccide automaticamente.

Penso che questo sia il modo semplice.


1

Ecco una funzione di supporto bash per uccidere più processi per nome o porta

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

Uso:

$ fkill [process name] [process port]

Esempio:

$ fkill someapp :8080 node :3333 :9000


0

Se vuoi un modo senza codice - apri il gestore attività e forza il nodo kill :)



-1

Passaggio 1: Trova il server in esecuzione: ps aux | grep puma Passaggio 2: Uccidi quei server Uccidi -9 [numero server]


-1

In mac OS

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


1
Questo è stato pubblicato come commento 5 anni fa e risposte simulate sono state pubblicate più volte.
Gilles Gouaillardet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.