在 Linux 上,如何知道哪个进程正在发送以太网数据包?

在 Linux 上,如何知道哪个进程正在发送以太网数据包?

我正在运行 gkrellm,它显示我的 Debian Linux 系统上的某个进程正在以大约 500KB/s 的速度向 eth0 写入数据。我想知道它是哪个进程。我对 netstat 略知一二,但它显示了无数个打开的 TCP 连接,我似乎无法让它生成任何有关流量的信息。

有人知道我如何获得实际进程的列表吗?使用eth0 接口,以便我可以追踪罪犯?


跟进:Debian Linux 发行版包含一个nethogs可以彻底解决此问题的软件包。不太合适的相关工具包括iftopnetstatlsof

答案1

我更喜欢网猪. 它是一个基于 ncurses 的小型控制台程序,可以方便地显示每个进程的网络流量状态。

答案2

netstat -ptu将为您提供所有 tcp 和 udp 连接的所属进程 ID(以及标准 netstat 信息)。(普通用户无法识别所有进程。)

如果某个事物正在发出相当数量的持续流量,您应该分别在第 2 列和第 3 列上看到Recv-QSend-Q

例子:
Recv-Q
sudo watch -n .1 'netstat -tup | grep -E "^[tc,ud]p[6]{0,1}" | sort -nr -k2'

Send-Q
sudo watch -n .1 'netstat -tup | grep -E "^[tc,ud]p[6]{0,1}" | sort -nr -k3'

如果您怀疑该进程正在被另一个进程触发ps axf

答案3

如果你只是在寻找发送/接收数据的进程,那么更手动的操作就是运行该lsof命令。这将列出每个进程的所有打开的文件,其中包括网络连接,因为它们是操作系统的文件描述符

不确定这是否就是您要找的。

答案4

用于tcpdump嗅探此接口上的一些数据包:

# tcpdump -vv -s0 -i eth0 -c 100 -w /tmp/eth0.pcap

复制到客户端并用 Wireshark 打开,看看会发生什么。

相关内容