Ci sono diversi modi per scoprire quale processo in esecuzione sta usando una porta.
Utilizzando fuser fornirà i PID delle istanze multiple associate alla porta di ascolto.
sudo apt-get install psmisc
sudo fuser 80/tcp
80/tcp: 1858 1867 1868 1869 1871
Dopo averlo scoperto, puoi interrompere o terminare il/i processo/i.
Puoi anche trovare i PID e altri dettagli usando lsof
sudo lsof -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1858 root 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1867 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1868 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1869 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1871 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
Limitare ai socket che ascoltano sulla porta 80 (al contrario dei client che si connettono alla porta 80):
sudo lsof -i tcp:80 -s tcp:listen
Per ucciderli automaticamente:
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Ecco un oneliner che mostra il comando da eseguire :
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
Sostituisci echo
di sudo
affinché il processo venga effettivamente interrotto.
Tre opzioni per elencare le porte aperte sono offerte in whatisonport
di jsh :
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
Preferisco netstat
perché è veloce, conciso e può elencare le porte aperte da altri utenti. (Anche se saranno comunque necessari i privilegi di superutente/utente per elencare i nomi e i PID di tali processi.)
Uscite
$ netstat -anp --numeric-ports | grep ":80\>.*:"
tcp6 0 0 :::80 :::* LISTEN 1914/apache2
$ fuser -v "80/tcp"
USER PID ACCESS COMMAND
80/tcp: root 1914 F.... apache2
www-data 12418 F.... apache2
...
$ lsof -P -S 2 -i "tcp:80" | grep "\(:80->.*:\|:80 (LISTEN)$\)"
apache2 1914 root 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
apache2 12418 www-data 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
...
L'uso di grep
in due casi è abbinare solo la porta sul lato locale e saltare le connessioni aperte a una porta remota 80. (Un'alternativa sarebbe usare -l
con netstat
o con lsof
per usare -sTCP:LISTEN
, ma mi piacciono i grep sopra perché cattureranno anche in uscita connessioni da la porta specificata, che occasionalmente può essere interessante.)
Con lsof
usiamo -P
per visualizzare :80
invece di :http
per rendere possibile il grep. Il -S 2
l'opzione forza lsof
da completare in modo tempestivo.
Uccidere il processo
Supponendo di voler utilizzare netstat
, potremmo prendere i PID in questo modo:
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
E potremmo persino passare quei PID a kill
:
... | xargs -d '\n' kill -KILL
Tuttavia c'è spesso un potenziale falso positivo quando si usano le espressioni regolari, quindi consiglierei di guardare solo l'output iniziale di netstat
e poi decidere manualmente se eseguire o meno:
$ kill -KILL 1914
Vedi anche
Ho un altro script chiamato listopenports
che potrebbe essere di interesse.