Trouver le PID du processus en utilisant un port spécifique?

392

J'installe hadoop sur mon système Ubuntu. Lorsque je le démarre, il indique que le port 9000 est occupé.

J'ai utilisé:

netstat -nlp|grep 9000

pour voir si un tel port existe et j'ai eu ceci:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

Mais comment puis-je obtenir le PID du processus qui le contient?

Wuchang
la source
netstatPour que cette commande fonctionne dans de nombreux systèmes d’exploitation, il vous suffit de trouver les arguments qui garantiront l’affichage des pids le long de chaque port ouvert connu.
Luciano

Réponses:

474

Sous Linux, vous devez être root ou propriétaire du processus pour obtenir les informations souhaitées. En tant que tel, pour les processus exécutés sous un autre utilisateur, le préfixe sudoest ce dont vous avez le plus besoin. En plus de cela, sur les systèmes Linux modernes, un ssoutil à utiliser pour faire cela:

$ sudo ss -lptn 'sport = :80'
State   Local Address:Port  Peer Address:Port              
LISTEN  127.0.0.1:80        *:*                users:(("nginx",pid=125004,fd=12))
LISTEN  ::1:80              :::*               users:(("nginx",pid=125004,fd=11))

Vous pouvez également utiliser la même invocation que vous utilisez actuellement, mais n'oubliez pas de sudo:

$ sudo netstat -nlp | grep :80
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  125004/nginx

Vous pouvez aussi utiliser lsof:

$ sudo lsof -n -i :80 | grep LISTEN
nginx   125004 nginx    3u  IPv4   6645      0t0  TCP 0.0.0.0:80 (LISTEN)
Chris Down
la source
36
Remarque: sous OSX, l' -poption concerne le protocole plutôt que le traitement. Voir cette question
Bryan P
3
@BryanP l'OP a demandé pour Ubuntu si c'est un peu hors de propos ...
Adam B
43
@AdamB Sauf si un utilisateur Mac est arrivé ici à la recherche deFinding the PID of the process using a specific port
mraaroncruz
2
Cette réponse serait probablement améliorée en plaçant le besoin sudoau sommet.
Nacht
2
@MrOnyancha Utilisez les options laconiques (-t) -lsof -ti tcp:80
Mohnish
138

Aussi, vous pouvez utiliser l' lsofutilitaire. Besoin d'être root.

# lsof -i :25
COMMAND  PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
exim4   2799 Debian-exim    3u  IPv4   6645      0t0  TCP localhost:smtp (LISTEN)
exim4   2799 Debian-exim    4u  IPv6   6646      0t0  TCP localhost:smtp (LISTEN)
Vitaliy
la source
9
Cette commande vous donnera également des processus avec des establishedconnexions, pas seulement des processus qui le sont listening.
firelynx
1
Pas nécessairement être root. Et, pour ceux qui veulent seulement obtenir le PID, vous pouvez lsof -i :25 -Fp, ce qui produit une sortie comme p1234.
Robert
12

J'utilise "CentOS 7 minimal" qui n'a ni netstatni lsof. Mais beaucoup de distributions Linux ont la commande socket statistics (ie ss).

Voici un exemple d'exécution:

# ss -tanp | grep 6379
LISTEN   0    128  127.0.0.1:6379   *:*   users:(("redis-server",pid=2531,fd=4))
Alexandr
la source
1
Voir aussiss -pntl 'sport = :6379'
Stéphane Chazelas
10

Exécuter la commande avec sudovous donnerait le PID. Sur ma machine de développement, je reçois:

$ netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      -

$ sudo netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      16449/java

Et comme mentionné dans d’autres réponses, vous pouvez également utiliser ssles lsofcommandes.

isapir
la source
commande courante en tant sudoqu'ID de processus d'affichage
Eugen Konkov
Mais que faire si sudo netstat -nlp | grep 34157encore afficher à la -place de PID?
Eugen Konkov
8

Aussi, vous pouvez utiliser fuser:

fuser -v -n tcp 22

Le résultat :

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd
GAD3R
la source
Il ne travaille tcp -n de fusion 80 , même je tente avec sudo
SuperKrish
1
Remarque: Cela nécessite sudosi le processus incriminé a également été démarré avecsudo
laggingreflex le
1
C'est une bonne chose à retenir en général. Les commandes sous Linux ne donnent généralement pas d'informations sur les processus lancés par root / sudo à moins que la commande ne soit exécutée avec Sudo. Cela est vrai même lorsque la commande n'a normalement pas besoin de sudo pour s'exécuter correctement.
njfife