nethogs是唯一能直接按进程维度实时显示收发流量的命令行工具,因其用libpcap拦截原始包并按socket关联进程,界面清晰列出PID、命令名及上下行速率,但必须sudo运行且需显式指定网卡(如ens3、eth1),不支持动态增删接口或容器内监控。

nethogs 是唯一能直接输出“进程级流量监控表”的命令行工具,但必须用 sudo 运行,且默认只显示活跃连接——静默进程、内核线程、容器内进程大概率不出现。
为什么 nethogs 是唯一靠谱的选择
iftop 显示的是 IP:端口 → IP:端口 连接对,你得手动关联到进程(比如用 ss + lsof);vnstat 只存接口总流量,不拆解进程;/proc/net/dev 是内核累计值,没进程维度。只有 nethogs 在用户态直接按进程聚合收发速率,界面里 PID、命令名、上行/下行速率一栏一栏列清楚。
- 它不依赖
/proc/pid/net/或 cgroup 统计,而是用libpcap拦截原始包,再按 socket 关联到进程 - 输出是实时刷新的表格,默认单位是
KB/s,右上角会标出当前单位(kb/s是千比特,KB是千字节,差 8 倍) - 按
r键可按总速率重排序,按s键专看上传,按m切换单位——但这些只影响当前屏幕,不改变底层统计逻辑
nethogs 启动时必须指定网卡,否则大概率失败
云服务器常见网卡名不是 eth0(阿里云是 ens3,AWS 是 eth1),不指定就会报错 Device eth0 not found。多网卡环境(比如同时有 eth0 和 wlan0)必须显式列出:sudo nethogs eth0 wlan0。
- 运行中无法动态增删网卡,按
q退出后重跑命令是唯一方式 - 别用
su -c "nethogs eth0",某些发行版下su不继承LD_LIBRARY_PATH,导致libpcap初始化失败 - 容器内运行常报
Unable to get pid of process,本质是 cgroups v2 或 SELinux 阻断了 socket 关联,不是权限问题
导出文本日志不能直接重定向,要用 -t + -c
sudo nethogs eth0 >> log.txt 几乎捕获不到有效数据,因为 nethogs 默认用 ncurses 刷新界面,stdout 写的是控制字符,不是纯文本。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 正确方式是加
-t(文本模式)和-c N(只采样 N 次):sudo nethogs -t -c 5 eth0 | tee log.txt -
-t模式下显示的是累计流量(单位 KB),不是瞬时速率,s/r排序键失效 - 想看每秒速率变化?只能靠外部轮询:
watch -n 1 'sudo nethogs -t -c 1 eth0 2>/dev/null | tail -n +3',但注意频繁调用会增加 CPU 开销
看到 “unknown host” 或全是 127.0.0.1,先检查 iftop 是否干扰
nethogs 不做 DNS 解析,所以不会出现 unknown host;如果你在 nethogs 界面里看到大量 127.0.0.1,大概率是误指定了 lo 接口,或者本机服务(如数据库、Redis)正在高频本地通信。
- 确认真实网卡名:
ip -br a | grep -v 'lo\|down' - 排除
lo干扰:sudo nethogs $(ip -br a | awk '$1 !~ /lo/ && $2 == "UP" {print $1; exit}') - 若仍只看到本地环回流量,说明外网出口确实没走该网卡——可能是路由表指向了别的接口,或应用绑定了
127.0.0.1
真正麻烦的不是怎么启动 nethogs,而是它看不到的东西:刚启动还没发包的进程、用 SOCK_RAW 绕过 socket 层的程序、eBPF 或 XDP 加速路径上的流量——这些都得换方案,比如 tc filter + perf 抓包分析。










