在脚本中使用 nethogs

在脚本中使用 nethogs

nethogs 是一款出色的工具,可以按进程监控网络流量。但是,它是“交互式”的,不适合在脚本中使用...如何使用 nethogs 或类似工具实现以下功能:

我想要监视一个进程(通过其 id 或名称)几秒钟,获取其流量(以数字形式,以任何单位如 KB/s),如果流量低于阈值,则脚本返回非零。

多谢。

编辑:

  1. Debian 10 服务器
  2. 我需要监控的程序是ffmpeg,它将RTSP流推送到远程RTMP服务器。即它是一个“客户端”,而不是“服务器”。
  3. 如果可能的话我想避免iptables。此外,由于有许多 ffmpeg 实例在运行,因此请找出每个每一个实例至关重要。我不知道 iptables 是否可以跟踪进程??

答案1

如果您的进程正在监听,比如服务器(HTTP/HTTPS/SSH),您需要知道进程绑定到哪些端口,然后您可以使用 iptables 会计规则。

您没有说您使用的是什么操作系统,但这个脚本应该具有相当的适应性。

### create a new set of chains ###
 /sbin/iptables -N INET_IN_PORT
 /sbin/iptables -N INET_OUT_PORT

### ATTACH them to the INPUT and OUTPUT Chains ###
 /sbin/iptables -A INPUT -j INET_IN_PORT
 /sbin/iptables -A OUTPUT -j INET_OUT_PORT

### Set up rules for INPUT ###
 /sbin/iptables -A INET_IN_PORT -i eth0 -p tcp --dport 80
 /sbin/iptables -A INET_IN_PORT -i eth0 -p tcp --dport 443
 /sbin/iptables -A INET_IN_PORT -i eth0 -p tcp --dport 22

### Set up rules for OUTPUT ###
 /sbin/iptables -A INET_OUT_PORT -o eth0 -p tcp --sport 80
 /sbin/iptables -A INET_OUT_PORT -o eth0 -p tcp --sport 443
 /sbin/iptables -A INET_OUT_PORT -o eth0 -p tcp --sport 22

这将监控端口 80,443,22 的传入和传出。

您可以在脚本中输入以下内容来显示计数器。

iptables -L INET_IN_PORT -v -n

iptables -L INET_OUT_PORT -v -n

$ iptables -L INET_IN_PORT -v -x

Chain INET_IN_PORT (1 references)
    pkts      bytes target     prot opt in     out     source               destination
       0        0            tcp  --  eth0   any     anywhere             anywhere             tcp dpt:http
       0        0            tcp  --  eth0   any     anywhere             anywhere             tcp dpt:https
     198    15497            tcp  --  eth0   any     anywhere             anywhere             tcp dpt:ssh

查询计数器后,您可能希望将其重置。因此,如果您每两秒查询一次,则可以检查计数器是否超出您定义的值。

iptables -L INET_IN_PORT -Z

iptables -L INET_OUT_PORT -Z

这应该为您提供足够的基础来编写满足您需求的脚本。

如果您的进程在每次负载上都使用动态端口,则查询它们正在使用的端口并相应地配置 iptables。

希望这会有所帮助,祝你好运!

答案2

我发现“nethogs”有一些命令行选项,特别是-t(跟踪模式),适合在脚本中使用:

nethogs -s -t -c 5 eno1 2>/dev/null | grep ffmpeg

这将对 eno1 接口上的所有流量进行 5 秒的计数,然后退出。

相关内容