메모리에서 처음 5개 프로세스가 포함된 JSON 문서를 가져오려고 합니다.
이 JSON을 Zabbix로 보내고 메모리를 통해 처음 5개 프로세스를 플롯하고 싶습니다.
다음 명령을 사용하여 메모리의 상위 5개 프로세스를 가져옵니다.
ps axho comm --sort -rss | head -5
node
mongod
kubelet
dockerd
systemd-journal
이 구조를 얻기 위해 키를 사용하여 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]
의 출력에서 처음 5개 행을 ps
배열로 추출하고, 두 번째 부분은 해당 배열을 의 값으로 삽입합니다 . 여기서 각 요소는 키를 사용하여 별도의 객체 data
로 변환됩니다 .{#PROCNAME}