Linux

在腳本中使用 nethogs

  • July 3, 2020

nethogs 是一個很好的按程序監控網路流量的實用程序。但是,它是“互動式”的,不適合在腳本中使用……如何使用 nethogs 或類似工具實現以下功能:

我想監視一個程序(通過它的 id 或名稱)幾秒鐘,獲取它的流量(作為一個數字,以任何單位,例如 KB/s),如果流量低於門檻值,則腳本返回非零。

非常感謝。

編輯:

  1. Debian 10 伺服器
  2. 我需要監控的程序是ffmpeg,它將RTSP流推送到遠端RTMP伺服器。即它是一個“客戶端”,而不是“伺服器”。
  3. 如果可能的話,我想避免使用iptables。此外,由於有許多 ffmpeg 實例正在執行,因此找出每個實例的****流量至關重要。我不知道 iptables 是否可以跟踪程序?

我發現nethogs有一些命令行選項,尤其是-t(跟踪模式),適合在腳本中使用:

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

這將統計 eno1 介面上的所有流量 5 秒,然後退出。

如果您的程序正在偵聽,例如伺服器(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。

我希望這會有所幫助,祝你好運!

引用自:https://serverfault.com/questions/1023720