Déterminer quel processus est lié à un port

90

Je sais qu'en utilisant la commande:

lsof -i TCP 

(ou une variante de paramètres avec lsof), je peux déterminer quel processus est lié à un port particulier. Cela est utile, par exemple, si j'essaie de démarrer quelque chose qui veut se lier à 8080 et qu'un autre utilise déjà ce port, mais je ne sais pas quoi.

Existe-t-il un moyen facile de faire cela sans utiliser lsof? Je passe du temps à travailler sur de nombreux systèmes et lsof n’est souvent pas installé.

Gilles
la source

Réponses:

112

netstat -lnplistera le pid et le nom du processus à côté de chaque port d'écoute. Cela fonctionnera sous Linux, mais pas dans tous les autres (comme AIX.) Ajoutez-le -tsi vous souhaitez utiliser le protocole TCP uniquement.

# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:24800           0.0.0.0:*               LISTEN      27899/synergys
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      3361/python
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2264/mysqld
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22964/apache2
tcp        0      0 192.168.99.1:53         0.0.0.0:*               LISTEN      3389/named
tcp        0      0 192.168.88.1:53         0.0.0.0:*               LISTEN      3389/named

etc.

Cakemox
la source
Cool merci. On dirait que cela fonctionne sous RHEL, mais pas sous Solaris (comme vous l'avez indiqué). Quelqu'un sait s'il existe quelque chose de similaire pour Solaris?
netstat -pci-dessus est mon vote. regardez aussi lsof.
Rich Homolka
En passant, pour Windows c'est pareil: netstat -aon | plus
Jonathan
Qu'en est-il pour SCTP?
Sudo
12

Sous AIX, netstat & rmsock peut être utilisé pour déterminer la liaison de processus:

[root@aix] netstat -Ana|grep LISTEN|grep 80
f100070000280bb0 tcp4       0      0  *.37               *.*        LISTEN
f1000700025de3b0 tcp        0      0  *.80               *.*        LISTEN
f1000700002803b0 tcp4       0      0  *.111              *.*        LISTEN
f1000700021b33b0 tcp4       0      0  127.0.0.1.32780    *.*        LISTEN

# Port 80 maps to f1000700025de3b0 above, so we type:
[root@aix] rmsock f1000700025de3b0 tcpcb
The socket 0x25de008 is being held by process 499790 (java).
frielp
la source
1
Merci pour cela! Y a-t-il un moyen, cependant, d'afficher simplement quel processus écoute sur le socket (au lieu d'utiliser rmsock qui tente de le supprimer)?
Olivier Dulac
2
@OlivierDulac: "Contrairement à ce que son nom l'indique, rmsock ne supprime pas le socket, s'il est utilisé par un processus. Il ne fait que signaler le processus contenant le socket." ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py
@ vitor-braga: ah merci! Je pensais que c'était en train d'essayer, mais je viens de dire quel processus tient quand il ne peut pas l'enlever. Apparemment, il n'essaye même pas de le supprimer lorsqu'un processus le retient. C'est super! Merci!
Olivier Dulac
8

Un autre outil disponible sous Linux est ss . De la page de manuel ss sur Fedora:

NAME
       ss - another utility to investigate sockets
SYNOPSIS
       ss [options] [ FILTER ]
DESCRIPTION
       ss is used to dump socket statistics. It allows showing information 
       similar to netstat. It can display more TCP and state informations  
       than other tools.

Exemple de sortie ci-dessous - la dernière colonne indique la liaison de processus:

[root@box] ss -ap
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                    :::http                    :::*        users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4)
LISTEN     0      128             127.0.0.1:munin                    *:*        users:(("munin-node",1278,5))
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",1175,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",1175,3))
LISTEN     0      10              127.0.0.1:smtp                     *:*        users:(("sendmail",1199,4))
LISTEN     0      128             127.0.0.1:x11-ssh-offset                  *:*        users:(("sshd",25734,8))
LISTEN     0      128                   ::1:x11-ssh-offset                 :::*        users:(("sshd",25734,7))
frielp
la source
3

Pour Solaris, vous pouvez utiliser pfiles puis grep par sockname:ou port:.

Un échantillon (à partir d' ici ):

pfiles `ptree | awk '{print $1}'` | egrep '^[0-9]|port:'
Eugen Constantin Dinca
la source
2

Une fois, j’étais confronté à la tentative de déterminer le processus derrière un port particulier (cette fois c’était 8 000). J'ai essayé une variété de lsof et netstat, mais j'ai alors tenté ma chance en essayant de frapper le port via un navigateur ( http: // nom_hôte: 8000 / ). Et voilà, un écran de démarrage m'a salué, et il est devenu évident que le processus était (pour l'enregistrement, c'était Splunk ).

Une dernière pensée: "ps -e -o pid, args" (YMMV) peut parfois indiquer le numéro de port dans la liste des arguments. Grep est votre ami!

Rickumali
la source
Dans le même esprit, vous pourriez telnet hostname 8000voir si le serveur affiche une bannière. Cependant, cela est surtout utile lorsque le serveur est en cours d'exécution sur une machine sur laquelle vous n'avez pas accès au shell et que la recherche de l'ID de processus n'est pas pertinente.
Gilles