确定绑定到端口的进程


90

我知道使用命令:

lsof -i TCP 

(或带有lsof的参数的某些变体),我可以确定哪个进程绑定到特定端口。如果我要启动要绑定到8080的东西,而其他人已经在使用该端口,但是我不知道是什么,这很有用。

有没有使用lsof的简便方法?我花时间在许多系统上工作,而lsof通常未安装。

Answers:


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

等等


太好了,谢谢。看起来可以在RHEL上运行,但不能在Solaris上运行(如您所述)。有人知道Solaris是否有类似的东西吗?

netstat -p以上是我的投票。也看lsof
Rich Homolka

顺便说一句,对于Windows,它类似于:netstat -aon | 更多
乔纳森(Jonathan)

SCTP呢?
sudo

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

1
谢谢你!但是,是否有一种方法可以只显示套接字上的侦听进程(而不是使用试图删除该进程的rmsock)?
Olivier Dulac

2
@OlivierDulac:“与其名称含义不同,如果某个进程正在使用rmsock,它不会删除套接字。它只会报告持有该套接字的进程。” (ibm.com/developerworks/community/blogs/cgaix/entry/...
的Vitor PY

@ vitor-braga:啊,谢谢!我以为它正在尝试,但只是说什么进程在无法删除时就一直存在。显然,当进程持有它时,它甚至不会尝试删除它。这很酷!谢谢!
Olivier Dulac 2013年

8

在Linux上可用的另一个工具是ss。在Fedora上的ss手册页中:

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


2

曾经有一次我试图确定特定端口后面是什么进程(这次是8000)。我尝试了各种lsof和netstat,但随后还是尝试了一下,并尝试通过浏览器(即http:// hostname:8000 /)访问端口。看得出来,一个启动屏幕迎接了我,很明显该过程是什么(据记录是Splunk)。

还有一个想法:“ ps -e -o pid,args”(YMMV)有时可能在参数列表中显示端口号。Grep是你的朋友!


同样,您可以telnet hostname 8000查看服务器是否打印横幅。但是,当服务器在没有外壳访问权限的计算机上运行,​​然后发现进程ID无关时,这最有用。
吉尔斯
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.