找出哪个进程正在侦听特定端口

找出哪个进程正在侦听特定端口

我一生中第一次无法弄清楚哪个进程正在 Linux 中的特定端口上侦听:)

这是 Ubuntu Server 22.04 安装,运行 K8s。集群中有一个入口控制器绑定到端口 80 和 443,我知道这是有效的,因为:

:~# curl localhost
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

:~# curl localhost:443
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx</center>
</body>
</html>

~# curl https://localhost:443 -k
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

问题是我无法弄清楚哪些进程绑定到这些端口以及如何绑定。我确实尝试使用ss,但没有显示任何内容:

:~# ss -tlnpu | grep 80
tcp   LISTEN 0      4096          192.168.13.191:2380       0.0.0.0:*    users:(("etcd",pid=1452,fd=8))           
tcp   LISTEN 0      4096               127.0.0.1:2380       0.0.0.0:*    users:(("etcd",pid=1452,fd=7))           

:~# ss -tlnpu | grep 443
tcp   LISTEN 0      4096                       *:6443             *:*    users:(("kube-apiserver",pid=1546,fd=7)) 

如何找出正在侦听端口的实际进程?

答案1

在您的具体情况下,我发现您正在运行 Kubernetes,因此您很有可能使用 docker 命令找到正在侦听该端口的容器:

$ docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
CONTAINER ID        NAMES                    PORTS
a690f047d3c8        quizzical_sanderson      0.0.0.0:8080->8080/tcp, 8443/tcp         
431ff622ad62        tender_payne             0.0.0.0:9191->9090/tcp
78941a2ee170        awx_task                 8052/tcp
2f5fc70ac576        awx_web                  0.0.0.0:80->8052/tcp, 0.0.0.0:443->8053/tcp

您可以看到容器awx_web将主机的端口 80 和 443 分别转发到容器专用网络命名空间中的端口 8052 和 8053。

你也可以直接运行docker ps,而不带--format参数。我使用这个--format参数是为了让它更具可读性和方便性。

相关内容