Determina il processo pid in ascolto su una certa porta


101

Come dice il titolo, sto eseguendo più server di gioco e ognuno di essi ha lo stesso namema diverso PIDe il portnumero. Vorrei abbinare il PIDserver che è in ascolto su una certa porta e poi vorrei terminare questo processo. Ne ho bisogno per completare il mio script bash.

È anche possibile? Perché non ha ancora trovato soluzioni sul web.

Risposte:


125

La -pbandiera di netstatti dà il PID del processo:

netstat -l -p

Modifica: il comando necessario per ottenere i PID degli utenti socket in FreeBSD è sockstat. Come abbiamo scoperto durante la discussione con @Cyclone, la linea che fa il lavoro è:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1

2
netstat: 80: unknown or uninstrumented protocolha usato la porta 80(nginx) per testare scopi. Non ha funzionato.
Ciclone

5
prova netstat -nlp | grep :80invece
stanwise

12
netstat: option requires an argument -- p
Ciclone

2
@jasonbrittain In Cygwin, netstatviene chiamato Windows Native . Ha un'altra sintassi.
stanwise

2
questa risposta è sbagliata: netstat: opzione richiede un argomento - p
Good Person

143

Versione breve che puoi passare al comando kill:

lsof -i:80 -t

13
Ciò include anche i processi connessi su quella porta. lsof -i4TCP:80 -sTCP:LISTEN -tè probabilmente quello che vuoi, invece.
Nevir

Esattamente quello che stavo cercando. Volevo interrompere un processo cercando la porta su cui è in esecuzione.
mythicalcoder

@ Nevir cosa intendi con "include anche i processi che sono collegati su quella porta"? Puoi spiegare per favore?
kishorer747

2
kill -9 `lsof -i:80 -t`per facilità di copia
bmjrowe

17

netstat -p -l | grep $PORTe le lsof -i :$PORT soluzioni sono buone ma preferisco la fuser $PORT/tcpsintassi dell'estensione a POSIX (che funziona per coreutils) come con pipe:

pid=`fuser $PORT/tcp`

stampa puro pid in modo da poter eliminare la sedmagia.

Una cosa che rende i fusermiei strumenti amante è la capacità di inviare il segnale direttamente a quel processo (questa sintassi è anche un'estensione di POSIX):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

Inoltre -k è supportato da FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser


1
fuser us più ordinato e conciso
Dawoodjee

10

netstat -nlp dovrebbe dirti il ​​PID di ciò che è in ascolto su quale porta.


1
netstat: 80: unknown or uninstrumented protocolha usato la porta 80(nginx) per testare scopi. Non ha funzionato.
Ciclone

3

Poiché sockstat non era installato in modo nativo sulla mia macchina, ho hackerato la risposta di stanwise per utilizzare invece netstat ..

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""

3

Volevo in modo programmatico , usando solo Bash, uccidere il processo in ascolto su una data porta.

Diciamo che il port è 8089, quindi ecco come l'ho fatto:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

Spero che questo aiuti qualcun'altro! So che aiuterà la mia squadra.


1
Ecco la funzione che uso per farlo: function kill-listener { lsof -i:$1 -t | xargs kill -9 }Usando il tuo esempio di porta 8089:kill-listener 8089
Uragano Hamilton

3

Sintassi:

kill -9 $ (lsof -t -i: portnumber)

Esempio: per terminare il processo in esecuzione sulla porta 4200, eseguire il seguente comando

kill -9 $(lsof -t -i:4200)

Testato in Ubuntu.


2

su Windows, l'opzione netstat per ottenere il pid è -o e -p seleziona un filtro di protocollo, es .: netstat -a -p tcp -o

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.