Определение того, какой процесс связан с портом

90

Я знаю, что с помощью команды:

lsof -i TCP 

(или некоторый вариант параметров с lsof) Я могу определить, какой процесс связан с конкретным портом. Это полезно, если я пытаюсь запустить что-то, что хочет привязать к 8080, а некоторые уже используют этот порт, но я не знаю что.

Есть ли простой способ сделать это без использования lsof? Я провожу время, работая на многих системах, и lsof часто не устанавливается.

жилль
источник

Ответы:

112

netstat -lnpперечислит pid и имя процесса рядом с каждым портом прослушивания. Это будет работать в Linux, но не во всех остальных (например, AIX). Добавьте, -tесли вы хотите только TCP.

# 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

и т.п.

Cakemox
источник
Хорошо, спасибо. Похоже, это работает под RHEL, но не под Solaris (как вы указали). Кто-нибудь знает, есть ли что-то подобное для Solaris?
netstat -pвыше мой голос. также посмотрите на lsof.
Rich Homolka
Кроме того, для окон это похоже: netstat -aon | больше
Джонатан
Как насчет SCTP?
Судо
12

В AIX netstat & rmsock можно использовать для определения привязки процесса:

[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
источник
1
Спасибо за это! Есть ли способ, однако, просто отобразить, какой процесс прослушивает сокет (вместо использования rmsock, который пытается его удалить)?
Оливье Дюлак
2
@OlivierDulac: «В отличие от его имени, rmsock не удаляет сокет, если он используется процессом. Он просто сообщает о процессе, удерживающем сокет». ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py,
@ Витор-Брага: Ах, спасибо! Я думал, что пытался, но просто сказал, какой процесс удерживает, когда он не может удалить его. Очевидно, он даже не пытается удалить его, когда процесс удерживает его. Это классно! Спасибо!
Оливье Дюлак
8

Другим инструментом, доступным в Linux, является ss . Со страницы man ss на 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.

Пример вывода ниже - последний столбец показывает привязку процесса:

[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
источник
3

Для Solaris вы можете использовать pfiles и затем grep с помощью sockname:или port:.

Образец ( отсюда ):

pfiles `ptree | awk '{print $1}'` | egrep '^[0-9]|port:'
Евгений Константин Динка
источник
2

Однажды я столкнулся с попыткой определить, какой процесс находится за конкретным портом (на этот раз это было 8000). Я пробовал разные lsof и netstat, но затем рискнул и попытался подключиться к порту через браузер (то есть http: // hostname: 8000 / ). И вот, меня приветствовал заставка, и стало очевидно, каков был процесс (для протокола, это был Splunk ).

Еще одна мысль: «ps -e -o pid, args» (YMMV) может иногда показывать номер порта в списке аргументов. Grep твой друг!

rickumali
источник
В том же духе вы можете telnet hostname 8000увидеть, печатает ли сервер баннер. Однако это в основном полезно, когда сервер работает на компьютере, к которому у вас нет доступа к оболочке, а затем поиск идентификатора процесса не имеет значения.
Жиль