Il existe plusieurs façons de trouver quel processus en cours d'exécution utilise un port.
En utilisant fuser, il donnera le ou les PID des multiples instances associées au port d'écoute.
sudo apt-get install psmisc
sudo fuser 80/tcp
80/tcp: 1858 1867 1868 1869 1871
Après l'avoir découvert, vous pouvez soit arrêter, soit tuer le ou les processus.
Vous pouvez également trouver les PID et plus de détails en utilisant 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)
Pour limiter aux sockets qui écoutent sur le port 80 (par opposition aux clients qui se connectent au port 80) :
sudo lsof -i tcp:80 -s tcp:listen
Pour les tuer automatiquement :
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Voici un oneliner qui montre la commande à lancer :
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
Remplacer echo
par sudo
pour que le processus soit réellement tué.
Trois options pour lister les ports ouverts sont proposées dans le whatisonport
de jsh :
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
Je préfère netstat
car il est rapide, concis et peut répertorier les ports ouverts par d'autres utilisateurs. (Bien qu'il aura toujours besoin de privilèges de superutilisateur/utilisateur pour répertorier les noms et les PID de ces processus.)
Sorties
$ 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'utilisation de grep
dans deux cas est de faire correspondre uniquement le port du côté local et d'ignorer les connexions ouvertes vers un port distant 80. (Une alternative serait d'utiliser -l
avec netstat
, ou avec lsof
utiliser -sTCP:LISTEN
, mais j'aime les greps ci-dessus car ils intercepteront également les sortants connexions de le port donné, ce qui peut parfois être intéressant.)
Avec lsof
nous utilisons -P
pour afficher :80
au lieu de :http
pour rendre le grep possible. Le -S 2
l'option force lsof
à terminer en temps opportun.
Tuer le processus
En supposant que nous voulons utiliser netstat
, nous pourrions récupérer les PID comme ceci :
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
Et nous pourrions même transmettre ces PID à kill
:
... | xargs -d '\n' kill -KILL
Cependant, il existe souvent un risque de faux positif lors de l'utilisation d'expressions régulières, je vous recommande donc de simplement regarder la sortie initiale de netstat
puis en décidant manuellement d'exécuter ou non :
$ kill -KILL 1914
Voir aussi
J'ai un autre script appelé listopenports
qui peuvent être intéressants.