列出进程PID正在侦听的端口(最好使用iproute2工具)?


Answers:


56

您可以ss从iproute2包(类似于netstat)中使用:

ss -l -p -n | grep "pid=1234,"

或(对于较旧的iproute2版本):

ss -l -p -n | grep ",1234,"

将1234替换为程序的PID。


3
也有-u-t仅用于UDB或TCP。:+1:这些都可以像这样堆叠:ss -tlnp,并消除填充宽度输出,我发现很烦人,您可以通过cat或更少或w / e进行ss -tlnp | cat
输送

1
我已经习惯了ss -nlp | cat,大致来说,向我展示监听进程(-l),端口号(-n)和进程信息(-p),并且不要尝试将输出适合我的shell | cat(或更少或其他)。只花了我两年时间就习惯了:D
ThorSummoner 16'7

不适用于我(在Debian 9上)。在那里,您需要grep表示“,pid = 1234”
ofrommel,

@ofrommel感谢您的提示-我修改了答案。
jofel

此外,这仅在具有root权限的情况下有效:)
ofrommel

56

我不知道使用iproute2工具的方式。但是,作为一种解决方法,您可以尝试一下。

lsof -Pan -p PID -i

应该给您您正在寻找的信息。


输出量

lsof -Pan -p 27808 -i
COMMAND   PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
httpd   27808 apache    5u  IPv6 112811294      0t0  TCP *:80 (LISTEN)
httpd   27808 apache    7u  IPv6 112811298      0t0  TCP *:8443 (LISTEN)
httpd   27808 apache    9u  IPv6 112811303      0t0  TCP *:443 (LISTEN)

我从这里得到了这个命令,但是不确定确切的链接,因为我在笔记本中记下了所有这些链接。但是您也可以从那里签出。


13

您可以使用netstat它来找出每个侦听进程的pid。

netstat-打印网络连接,路由表,接口统计信息,伪装连接和多播成员身份

-a,--all同时显示侦听和非侦听(对于TCP,这意味着已建立的连接)套接字。使用--interfaces选项,显示未标记的接口

--numeric,-n显示数字地址,而不是尝试确定符号主机,端口或用户名。

-p,--program显示每个套接字所属的程序的PID和名称。

这是一个例子:

# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1507/rpcbind
tcp        0      0 0.0.0.0:51188               0.0.0.0:*                   LISTEN      1651/rpc.statd
tcp        0      0 0.0.0.0:1013                0.0.0.0:*                   LISTEN      1680/ypbind
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1975/sshd
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1763/cupsd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2081/master
tcp        0      0 127.0.0.1:27017             0.0.0.0:*                   LISTEN      2119/mongod
tcp        0     48 172.16.33.73:22             172.16.127.110:51850        ESTABLISHED 25473/sshd
tcp        0      0 172.16.33.73:22             172.16.127.110:51214        ESTABLISHED 24699/sshd
tcp        0      0 :::111                      :::*                        LISTEN      1507/rpcbind
tcp        0      0 :::9200                     :::*                        LISTEN      1994/java
tcp        0      0 :::9300                     :::*                        LISTEN      1994/java
tcp        0      0 :::22                       :::*                        LISTEN      1975/sshd
tcp        0      0 ::1:631                     :::*                        LISTEN      1763/cupsd
tcp        0      0 ::1:25                      :::*                        LISTEN      2081/master
tcp        0      0 :::59162                    :::*                        LISTEN      1651/rpc.statd

1
谢谢您,尽管我已经得知netstatiproute2工具已弃用该功能,并且我希望避免使用它。
ThorSummoner 2014年

12

@jofel的答案向您显示了要使用的适当工具ss,这是iproute2中其他网络工具的替代品。

不推荐使用的命令及其iproute2等效项如下:

deprecated      replacement(s)
==========      ==============
- arp           ip n (ip neighbor)
- ifconfig      ip a (ip addr), ip link, ip -s (ip -stats)
- iptunnel      ip tunnel
- iwconfig      iw
- nameif        ip link, ifrename
- netstat       ss, ip route (for netstat-r), ip -s link (for netstat -i), 
                ip maddr (for netstat-g)

- route         ip r (ip route)

基本列表也在Wikipedia上:http : //en.wikipedia.org/wiki/Iproute2

参考文献


1

lsof如果您不知道PID,而仅知道程序的名称,则可以使用另一种方法:

lsof -Pa -p $(pgrep [programName]) -i

无法lsof在Ubuntu 16.04上使用4.89
Palik

1
如果程序产生了多个进程就会是这种情况,在这种情况下,您在运行我给出的lsof命令时需要指定特定的PID。 pgrep <program name>然后选择上述命令所需的PID。用$(pgrep [programName])PID#代替
cryptoboy '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.