首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以json格式获取系统状态?

如何以json格式获取系统状态?
EN

Server Fault用户
提问于 2018-04-16 13:23:23
回答 3查看 14.1K关注 0票数 13

我希望以机器可读的形式获得服务状态详细信息(加载、启用、活动、运行、自、主PID),而且我知道systemd工具有--output=json选项,但如果我这样做的话:

代码语言:javascript
运行
复制
 systemctl status servicename --output=json --plain

我看到的是:

代码语言:javascript
运行
复制
● snapd.service - Snappy daemon
   Loaded: loaded (/lib/systemd/system/snapd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-04-16 11:20:07 MSK; 4h 45min ago
 Main PID: 738 (snapd)
    Tasks: 10 (limit: 4915)
   CGroup: /system.slice/snapd.service
           └─738 /usr/lib/snapd/snapd

{ "__CURSOR" : "s=461ecb6a4b814913acd57572cd1e1c82;...

日志记录在JSON中。但是,如果可能的话,如何获得JSON中的服务状态呢?

EN

回答 3

Server Fault用户

回答已采纳

发布于 2018-04-19 10:11:38

以机器可读的形式获取服务状态的简单方法:

代码语言:javascript
运行
复制
systemctl show --no-pager servicename

此命令以key=value格式输出数据:

代码语言:javascript
运行
复制
Type=notify
Restart=always
NotifyAccess=main
...

如果需要JSON格式,可以使用以下简单的Python脚本(Python2和3兼容) get_service_info.py

代码语言:javascript
运行
复制
import os, sys, subprocess, json
key_value = subprocess.check_output(["systemctl", "show", sys.argv[1]], universal_newlines=True).split('\n')
json_dict = {}
for entry in key_value:
    kv = entry.split("=", 1)
    if len(kv) == 2:
        json_dict[kv[0]] = kv[1]
json.dump(json_dict, sys.stdout)

用法:

代码语言:javascript
运行
复制
get_service_info.py servicename
票数 13
EN

Server Fault用户

发布于 2018-06-19 22:04:16

您也可以为此使用jq

代码语言:javascript
运行
复制
systemctl show --no-page iptables \
    | jq --slurp --raw-input \
        'split("\n")
        | map(select(. != "") 
        | split("=") 
        | {"key": .[0], "value": (.[1:] | join("="))})
        | from_entries'

生产:

代码语言:javascript
运行
复制
{
  "Type": "oneshot",
  "Restart": "no",
  "NotifyAccess": "none",
  "ExecStart": "{ path=/usr/libexec/iptables/iptables.init ; argv[]=/usr/libexec/iptables/iptables.init start ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
  [... like 60 more entries ...],
  "CollectMode": "inactive"
}

jq命令的解码:

代码语言:javascript
运行
复制
--slurp - read the whole thing as a really big string
--raw-input - p.s. it's not json input
split("\n") - break the input into an array of lines
map( ... )  - perform some transformation on each array element
select(. != "") - skip blank lines
split("=") - split the current line into array elements at each "="
(.[1:] | join("=")) - avoid mangling values with equal signs

(请注意:如果值本身包含相等号,这将截断值。这可能是可以解决的,但出于这个目的似乎还不错)

代码语言:javascript
运行
复制
{"key": .[0], "value": .[1]}  - build an key/value pair object

(此时map返回一个键/值对象数组)

代码语言:javascript
运行
复制
from_entries - turn an array of "key"/"value" objects into an object
票数 12
EN

Server Fault用户

发布于 2018-04-16 14:44:27

开发人员建议使用dbus API对服务状态进行编程访问。如果确实需要JSON,则可以调整DBUS以生成所需的JSON。

有关开发人员为什么推荐DBUS而不是JSON输出的问题,请参见-输出json不产生json输出问题。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/907857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档