如何获取进程(PID)发起的连接

如何获取进程(PID)发起的连接

例如tomcat(PID是4739)发起到postgress(另一台服务器)的连接以从数据库检索数据,因为tomcat从客户端()收到请求curl 192.168.1.12:8088/get。在此,tomcat使用随机 tcpsource port进行连接postgress。现在,有什么方法可以获取source ports由 tomcat 创建的这些内容PID

我用过netstat -tp,但无法PID连接。只得到PID我使用的l - Listening喜欢netstat -tlp。我尝试PID从中读取套接字/proc/PID/fd,然后关联到/proc/net/tcp.但我没有看到任何东西/proc/net/tcp

笔记:拓扑如下。

My requests(server1)<--------> tomcat(server2)<-------->postgress(server2)

更新1 netstat -tepn输出

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp6       0      1 172.25.30.21:36598      xx.xx.xx.91:4343     SYN_SENT    0          42955126    9661/java
tcp6       0      0 172.25.30.21:38340      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38064      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38282      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37520      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38286      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37654      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37906      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38152      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38124      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37412      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37374      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38126      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38252      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37224      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37800      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37780      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38274      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37244      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37880      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38230      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38118      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:37496      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:1099       172.25.30.21:47496      ESTABLISHED 0          42954824    4738/java
tcp6       0      0 172.25.30.21:37474      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38200      172.25.30.12:5432       TIME_WAIT   0          0           -
tcp6       0      0 172.25.30.21:38102      172.25.30.12:5432       TIME_WAIT   0          0           -

PID grep编辑输出

veeru@localhost:~/veeru# netstat -tepn | grep 4738
tcp6       0      0 127.0.1.1:41095         127.0.0.1:45180         ESTABLISHED 0          42960213    4738/java       
tcp6       0      0 172.25.30.21:1099       172.25.30.21:49984      ESTABLISHED 0          42963153    4738/java 

答案1

netstat -tep | grep <pid of server2>

这应该为您提供 server2 连接到 postgress 时使用的源端口。

答案2

在 Linux 上

  • netstat -atp
  • ss -atp
  • lsof -i tcp

将为您提供 TCP 套接字列表以及netcat打开了 fd 的进程的 pid(以及除 之外的 fd)(您需要超级用户权限才能获取不属于您的进程的信息),但前提是他们确实有一个开放的FD。

在进程关闭其 fd 到套接字或 shutdown() 连接后,即使只是写入方向,也不再可能获取该信息。您可能仍然会在或TIME_WAIT的输出中看到处于某种状态的套接字,但据我所知,没有办法返回到具有文件描述符的进程。netstatss

在这种情况下,最好的选择可能是记录所有发生的 TCP 连接,例如使用auditctl审核日志connect()系统调用。

相关内容