サービスステータスの詳細(読み込み済み、有効、アクティブ、実行中、メインPID)を機械読み取り可能な形式で取得したいのですが、systemdツールに--output=json
オプション、ただし私が行う場合:
systemctl status servicename --output=json --plain
私は次のようなものを見ます:
● 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で取得するにはどうすればよいですか?
機械可読形式でサービスステータスを取得する簡単な方法:
systemctl show servicename --no-page
このコマンドは、key=value
フォーマット:
Type=notify
Restart=always
NotifyAccess=main
...
JSON
形式が必要な場合は、次の簡単なPythonスクリプト(Python 2および3互換)get_service_info.py
:
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)
使用法:
get_service_info.py servicename
これにはjq
も使用できます。
systemctl show --no-page iptables \
| jq --Slurp --raw-input \
'split("\n")
| map(select(. != "")
| split("=")
| {"key": .[0], "value": (.[1:] | join("="))})
| from_entries'
生成する:
{
"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
コマンドのデコード:
--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
(警告:これは、値自体に等号が含まれている場合、値を切り捨てます。これはおそらく回避できますが、この目的には問題ないようです)
{"key": .[0], "value": .[1]} - build an key/value pair object
(この時点でmap
はキー/値オブジェクトの配列を返します)
from_entries - turn an array of "key"/"value" objects into an object
開発者による推奨は、サービスステータスへのプログラムによるアクセスに dbus API を使用することです。 JSONが本当に必要な場合は、DBUS APIを調整して、必要なJSONを生成できます。
JSON出力よりもDBUS APIが推奨される理由についての開発者間の議論については、Githubの問題 -output jsonがjson出力を生成しない を参照してください。