Знаходження PID процесу за допомогою певного порту?


391

Я встановлюю hadoop у своїй системі Ubuntu. Коли я його запускаю, він повідомляє, що порт 9000 зайнятий.

Я використав:

netstat -nlp|grep 9000

щоб побачити, чи існує такий порт, і я отримав це:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

Але як я можу отримати PID процесу, який його утримує?




netstatКоманда може працювати в багатьох операційних системах, щоб дозволити вам це отримати, вам просто потрібно знайти аргументи, які забезпечать, що вона буде показувати підказки вздовж кожного відомого відкритого порту.
Лучано

Відповіді:


474

В Linux ви повинні мати root або власника процесу, щоб отримати бажану інформацію. Таким чином, для процесів, що працюють як інший користувач, попередньо створювати sudoбільшу частину того, що вам потрібно. На додаток до цього, у сучасних системах Linux ssце інструмент:

$ 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))

Ви також можете використовувати той самий виклик, який ви використовуєте зараз, але пам’ятайте, що sudo:

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

Ви також можете використовувати lsof:

$ sudo lsof -n -i :80 | grep LISTEN
nginx   125004 nginx    3u  IPv4   6645      0t0  TCP 0.0.0.0:80 (LISTEN)

36
Примітка: в OSX -pопція є для протоколу, а не для процесу. Дивіться це запитання
Bryan P

3
@BryanP ОП попросив Ubuntu, так що це неактуально ...
Адам Б

43
@AdamB Якщо тільки користувач Mac не приїхав сюди в пошукахFinding the PID of the process using a specific port
mraaroncruz

2
Цю відповідь, ймовірно, можна було б покращити, поставивши потребу sudoвгорі.
Нахт

2
@MrOnyancha Використовуйте термінові (-t) варіанти -lsof -ti tcp:80
Mohnish

138

Також ви можете скористатися lsofутилітою. Потрібно бути корінцем.

# 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)

9
Ця команда також надасть вам процеси із establishedз'єднаннями, а не лише процеси, які є listening.
firelynx

1
Не обов’язково бути коренем. А для тих, хто хоче отримати лише PID, ви можете lsof -i :25 -Fp, який видає вихід p1234.
Роберт

12

Я використовую "CentOS 7 minimal", який не має ні того, netstatні іншого lsof. Але в багатьох дистрибутивах Linux є команда статистики сокета (тобто ss).

Ось приклад виконання:

# ss -tanp | grep 6379
LISTEN   0    128  127.0.0.1:6379   *:*   users:(("redis-server",pid=2531,fd=4))

1
Дивіться такожss -pntl 'sport = :6379'
Stéphane Chazelas

10

Запуск команди з sudoдасть вам PID. На своїй машині розвитку я отримую:

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

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

І як зазначено в інших відповідях, ви також можете використовувати команди ssабо lsof.


працює команда як sudoідентифікатор процесу відображення
Євген Конков

Але що робити, якщо sudo netstat -nlp | grep 34157все-таки відображатись -замість PID?
Євген Конков

8

Також ви можете використовувати fuser:

fuser -v -n tcp 22

Вихід:

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd

Не працює fuser -v -n tcp 80 , навіть я намагаюся з
судо

1
Примітка. Це вимагається, sudoякщо також sudo
порушено

1
Це добре пам’ятати загалом. Команди в Linux, як правило, не дають інформацію про процеси, запущені root / sudo, якщо команда не запускається з Sudo. Це справедливо навіть у тому випадку, коли команді зазвичай не потрібен sudo для правильного запуску.
njfife
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.