특정 CPU, 메모리, 인터페이스 통계만 검색하는 방법

특정 CPU, 메모리, 인터페이스 통계만 검색하는 방법

%idle, memfree, available, pmeused 등 특정 통계만 수집해야 합니다. 또한 출력을 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, 메모리, 디스크, 네트워크, 센서)에 대한 정보를 검색하기 위한 크로스 플랫폼 라이브러리입니다. 주로 시스템 모니터링, 분석, 프로세스 리소스 제한 및 실행 중인 프로세스 관리에 사용됩니다. 이는 ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, tasket, pmap과 같은 UNIX 명령줄 도구에서 제공하는 많은 기능을 구현합니다.

예:

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}

유용한 링크: https://github.com/giampaolo/psutil

답변2

제 생각에는선택하는 도구입니다.

jqJSON 데이터와 마찬가지로 , 당신 과 친구들이 텍스트를 처리하는 sed것처럼 쉽게 구조화된 데이터를 분할, 필터링, 매핑 및 변환하는 데 사용할 수 있습니다 .sedawkgrep

Github에서 훌륭한 튜토리얼을 jq찾을 수 있습니다.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-놀이터

관련 정보