Linux
在腳本中使用 nethogs
nethogs 是一個很好的按程序監控網路流量的實用程序。但是,它是“互動式”的,不適合在腳本中使用……如何使用 nethogs 或類似工具實現以下功能:
我想監視一個程序(通過它的 id 或名稱)幾秒鐘,獲取它的流量(作為一個數字,以任何單位,例如 KB/s),如果流量低於門檻值,則腳本返回非零。
非常感謝。
編輯:
- Debian 10 伺服器
- 我需要監控的程序是ffmpeg,它將RTSP流推送到遠端RTMP伺服器。即它是一個“客戶端”,而不是“伺服器”。
- 如果可能的話,我想避免使用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。
我希望這會有所幫助,祝你好運!