![确定哪个进程绑定到端口](https://linux22.com/image/16353/%E7%A1%AE%E5%AE%9A%E5%93%AA%E4%B8%AA%E8%BF%9B%E7%A8%8B%E7%BB%91%E5%AE%9A%E5%88%B0%E7%AB%AF%E5%8F%A3.png)
我知道使用命令:
lsof -i TCP
(或 lsof 参数的某些变体)我可以确定哪个进程绑定到特定端口。如果我试图启动一些想要绑定到 8080 的东西,而其他一些东西已经在使用该端口,但我不知道是什么,这很有用。
有没有一种简单的方法可以在不使用 lsof 的情况下做到这一点?我花了很多时间在许多系统上工作,但 lsof 通常没有安装。
答案1
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
ETC。
答案2
Linux 上另一个可用的工具是SS。来自SSFedora 的手册页:
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))
答案3
在 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).
答案4
我曾经遇到过尝试确定特定端口后面的进程(这次是 8000)。我尝试了各种 lsof 和 netstat,但后来冒险尝试通过浏览器访问端口(即http://主机名:8000/)。你瞧,出现了一个闪屏,很明显这个过程是什么(根据记录,它是斯普朗克)。
另一种想法是:“ps -e -o pid,args”(YMMV) 有时可能会在参数列表中显示端口号。 Grep 是你的朋友!