2012-03-24 14 views
64

Come dice il titolo, sto eseguendo più server di gioco, e ognuno di essi ha lo stesso ma diverso PID e il numero port. Mi piacerebbe abbinare il PID del server che è in ascolto su determinate porte, e quindi mi piacerebbe uccidere questo processo. Ho bisogno di questo per completare il mio script bash.Determinare il processo PID in ascolto su una determinata porta

È possibile? Perché non ha trovato ancora nessuna soluzione sul web.

risposta

90

La -p bandiera della netstat ti dà PID del processo:

netstat -l -p 

Edit: Il comando che è necessario per ottenere il PID di utenti presa in FreeBSD è sockstat. Come abbiamo lavorato durante la discussione con @Cyclone, la linea che fa il lavoro è:

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

'netstat: 80: protocollo sconosciuto o non strumentato 'ha usato la porta' 80' (nginx) per testare i purpoes. Non ha funzionato – Cyclone

+0

Come hai ottenuto questo errore? Quale comando preciso l'ha prodotto? – stanwise

+0

'netstat -l -p 80', quando eseguo' netstat -l -p' sto ricevendo il manuale: http://pastebin.com/raw.php?i=q9jeQSBj – Cyclone

7

netstat -nlp dovrebbe dirti il ​​PID di cosa sta ascoltando su quale porta.

+1

'netstat: 80: protocol' sconosciuto o uninstrumented usato la porta '80' (nginx) per testare i purpoes. Non ha funzionato – Cyclone

106

Versione corta che è possibile passare ad uccidere comando:

lsof -i:80 -t 
+4

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

+0

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

+0

@Nevir cosa intendi per "include anche i processi connessi su quella porta"? Puoi spiegare per favore? – kishorer747

8

netstat -p -l | grep $PORT e lsof -i :$PORT soluzioni sono buone ma preferisco fuser $PORT/tcp estensione sintassi POSIX (che funziona per coreutils) come con tubo:

pid=`fuser $PORT/tcp` 

stampa pid puro in modo da poter eliminare la magia sed.

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

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

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

1

Dal momento che non è stato sockstat nativamente installato sulla mia macchina ho inciso fino risposta di stanwise utilizzare netstat invece ..

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"" 
1

voglio a programmaticamente - utilizzando solo Bash - interrompe il processo in ascolto su una determinata porta.

Diciamo che la porta è 8089, allora ecco come 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 aiuta a qualcun altro! So che aiuterà la mia squadra.

+0

Ecco la funzione che uso per farlo: 'function kill-listener { lsof -i: $ 1 -t | xargs kill -9 } ' Utilizzando l'esempio della porta 8089:' kill-listener 8089' –

0

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