![如何仅检索特定的 cpu、内存和接口统计信息](https://linux22.com/image/158322/%E5%A6%82%E4%BD%95%E4%BB%85%E6%A3%80%E7%B4%A2%E7%89%B9%E5%AE%9A%E7%9A%84%20cpu%E3%80%81%E5%86%85%E5%AD%98%E5%92%8C%E6%8E%A5%E5%8F%A3%E7%BB%9F%E8%AE%A1%E4%BF%A1%E6%81%AF.png)
需要仅收集特定的统计信息,例如 %idle、memfree、available、pmemused 等。我还必须将输出转换为 json 字符串并使用它。
有没有 UNIX 工具可以做同样的事情?
我尝试组合使用 sar 和 Sadf,但得到了我不需要的复杂 json 格式。
/usr/bin/sar -r 1 1 -o tmp1 &> 1;
/usr/bin/sadf tmp1 -j --iface=eth1 -- -u -r -n DEV
我得到这个输出:
{
"sysstat": {
"hosts": [{
"nodename": "ESDNAS1",
"sysname": "Linux",
"release": "4.4.143-94.47-default",
"machine": "x86_64",
"number-of-cpus": 8,
"file-date": "2019-08-02",
"file-utc-time": "04:53:09",
"statistics": [{
"timestamp": {
"date": "2019-08-02",
"time": "04:53:10",
"utc": 1,
"interval": 1
},
"cpu-load": [{
"cpu": "all",
"user": 0.25,
"nice": 0.00,
"system": 1.00,
"iowait": 0.00,
"steal": 0.00,
"idle": 98.75
}],
"memory": {
"memfree": 3707764,
"avail": 12451860,
"memused": 12013448,
"memused-percent": 45.01,
"buffers": 225176,
"cached": 4361204,
"commit": 28665304,
"commit-percent": 107.41,
"active": 13473076,
"inactive": 1535816,
"dirty": 616
},
"network": {
"net-dev": [{
"iface": "eth1",
"rxpck": 1.00,
"txpck": 1.00,
"rxkB": 0.11,
"txkB": 0.00,
"rxcmp": 0.00,
"txcmp": 0.00,
"rxmcst": 0.00,
"ifutil-percent": 0.00
}]
}
}],
"restarts": []
}]
}
}
我正在寻找这样的东西(或关闭一个简单的东西):
{
"sysstat": {
"hosts": [
{
"nodename": "HOSTNAME",
"statistics": [
{
"timestamp": {
"date": "2019-08-02",
"time": "04:53:10"
},
"cpu-load": [
{
"idle": 98.75
}
],
"memory": {
"memfree": 3707764,
"avail": 12451860,
"memused-percent": 45.01
},
"network": {
"net-dev": [
{
"iface": "eth1",
"rxpck": 1,
"txpck": 1,
"ifutil-percent": 0
}
]
}
}
],
"restarts": []
}
]
}
}
答案1
您可以使用普苏蒂尔在 python 中并创建您的自定义 json。
psutil(python 系统和进程实用程序)是一个跨平台库,用于检索 Python 中正在运行的进程和系统利用率(CPU、内存、磁盘、网络、传感器)的信息。它主要用于系统监控、分析、限制进程资源和管理正在运行的进程。它实现了 UNIX 命令行工具提供的许多功能,例如:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap。
例子:
import json
import psutil
def used_mem(json_key):
mem_total = psutil.virtual_memory().total
mem_percent = psutil.virtual_memory().percent
mem_used = psutil.virtual_memory().used
mem_free = psutil.virtual_memory().free
swap_percent = psutil.swap_memory().percent
swap_total = psutil.swap_memory().total
swap_used = psutil.swap_memory().used
json_key['free_mem'] = mem_free
json_key['total_mem'] = mem_total
json_key['mem_used'] = mem_used
json_key['percent_mem'] = mem_percent
json_key['swap_percent'] = swap_percent
json_key['swap_total'] = swap_total
json_key['swap_used'] = swap_used
json_key={}
used_mem(json_key)
print json.dumps(json_key)
输出:
{"swap_used": 14061568, "percent_mem": 48.3, "free_mem": 1792401408, "total_mem": 12447776768, "mem_used": 5128196096, "swap_total": 11999899648, "swap_percent": 0.1}
答案2
我认为杰克是首选工具。
jq
就像sed
JSON 数据一样 - 您可以使用它来切片、过滤、映射和转换结构化数据,就像sed
、awk
和grep
朋友让您处理文本一样轻松。
精彩的教程jq
可以在 Github 上找到https://stedolan.github.io/jq/tutorial/这里还有一个不错的:https://programminghistorian.org/en/lessons/json-and-jq。
例如,要访问“memfree”部分,请将命令的输出通过管道传输到jq
如下所示:
... | jq .[].hosts[].statistics[].memory.memfree
这使:
3707764
或者,要获取 JSON 中的整个内存部分:
... | | jq .[].hosts[].statistics[].memory
这使:
{
"memfree": 3707764,
"avail": 12451860,
"memused": 12013448,
"memused-percent": 45.01,
"buffers": 225176,
"cached": 4361204,
"commit": 28665304,
"commit-percent": 107.41,
"active": 13473076,
"inactive": 1535816,
"dirty": 616
}
答案3
jq
如果您无法调整原始命令(sar
或sadf
)来生成您期望的 JSON,请使用 JSON 解析器执行此操作,如下所示
jq '.sysstat.hosts[] |= { nodename, statistics : [ { timestamp : .statistics[].timestamp | { date, time },
"cpu-load": .statistics[]."cpu-load"[] | [{ idle }],
"memory": .statistics[].memory | { memfree, avail, "memused-percent" },
"network" : { "net-dev" : .statistics[].network."net-dev"[] | { iface, rxpck, txpck, "ifutil-percent"} } } ] , restarts}'
你可以看到这个过滤器工作在jq-1.6 上的 jq-playground