Нахождение PID процесса с использованием определенного порта?

392

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

Я использовал:

netstat -nlp|grep 9000

чтобы увидеть, существует ли такой порт, и я получил это:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

Но как я могу получить PID процесса, который его держит?

Учан
источник
Смотрите этот wilddiary.com/find-the-process-using-a-given-port
Дрона
netstatКоманда может работать во многих операционных системах, чтобы вы могли это получить, вам просто нужно найти аргументы, которые обеспечат отображение pids вдоль каждого известного открытого порта.
Лучано

Ответы:

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опция предназначена для протокола, а не для процесса. Смотрите этот вопрос
Брайан П
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
Мохниш,
138

Также вы можете использовать lsofутилиту. Нужно быть 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)
Виталий
источник
9
Эта команда также даст вам процессы с establishedподключениями, а не только процессы, которые есть listening.
firelynx
1
Не обязательно быть root. И, для тех, кто хочет получить только PID, вы можете lsof -i :25 -Fp, который производит вывод, как p1234.
Роберт
12

Я использую "CentOS 7 минимальный", который не имеет ни того, 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'
Стефан Шазелас
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.

isapir
источник
запуск команды в качестве sudoидентификатора процесса отображения
Евгений Коньков
Но что, если sudo netstat -nlp | grep 34157все еще отображать -вместо PID?
Евгений Коньков
8

Также вы можете использовать fuser:

fuser -v -n tcp 22

Выход :

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd
GAD3R
источник
Не работает fuser -v -n tcp 80 , даже если я пытаюсь использовать sudo
SuperKrish
1
Примечание: это требует, sudoесли процесс оскорбления также был запущенsudo
laggingreflex
1
Это хорошая вещь, чтобы помнить вообще. Команды в Linux обычно не дают информацию о процессах, запускаемых root / sudo, если только команда не запускается с помощью Sudo. Это верно даже в том случае, когда команде обычно не требуется sudo для корректной работы.
njfife