我正在尝试通过内存获取包含前 5 个进程的 JSON 文档。
我想将此 JSON 发送到 Zabbix 并通过内存绘制前 5 个进程。
我通过以下命令获取内存中排名前 5 的进程:
ps axho comm --sort -rss | head -5
node
mongod
kubelet
dockerd
systemd-journal
如何使用key 将ps
+的输出转换为 JSON以获得此结构:head
{#PROCNAME}
{
"data": [
{
"{#PROCNAME}": "node"
},
{
"{#PROCNAME}": "mongod"
},
{
"{#PROCNAME}": "kubelet"
},
{
"{#PROCNAME}": "dockerd"
},
{
"{#PROCNAME}": "systemd-journal"
}
]
}
https://www.zabbix.com/documentation/current/manual/config/macros/lld_macros
低级发现 (LLD) 功能中使用了一种宏:
{#MACRO}
答案1
如果您jq
有该inputs
函数,并且假设{#PROCNAME}
只是一个字符串,则可以使用以下内容:
ps axho comm --sort -rss | head -5 | jq -Rn '{data: [inputs|{"#PROCNAME":.}]}'
这些inputs
函数可以jq
读取所有输入字符串。剩下的就是装饰以获得想要的格式。
该选项-R
获取原始字符串作为输入。该选项通过条目-n
提供jq
输入null
。这样inputs
可以一次性获取所有字符串。
答案2
实际上,你只需使用标准的 unix cli 就可以实现它:
bash $ echo { \"data\": [ $(ps axho comm --sort -rss | head -5 | xargs -L1 -I% echo { \"{#PROCNAME}\": \"%\" } | paste -s -d, -) ] }
{ "data": [ { "{#PROCNAME}": "node" },{ "{#PROCNAME}": "mongod" },{ "{#PROCNAME}": "kubelet" },{ "{#PROCNAME}": "dockerd" },{ "{#PROCNAME}": "systemd-journal" } ] }
bash $
- 生成的输出是有效的 JSON。
答案3
这类似于奥利夫溶液,但将head
操作移至jq
:
ps axho comm --sort -rss |
jq -Rn '[inputs][:5] | { data: map({ "{#PROCNAME}": . }) }'
第一部分 ,[inputs][:5]
从 的输出中提取前五行ps
作为数组,第二部分将该数组作为 的值插入data
,其中每个元素都转换为带有{#PROCNAME}
键的单独对象。