"{#PROCNAME}" 키를 사용하여 "ps" 및 "head"의 출력을 JSON으로 변환하는 방법은 무엇입니까?

"{#PROCNAME}" 키를 사용하여 "ps" 및 "head"의 출력을 JSON으로 변환하는 방법은 무엇입니까?

메모리에서 처음 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제공합니다 . 이렇게 하면 모든 문자열을 한 번에 얻을 수 있습니다.jqnullinputs

답변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}

관련 정보