Systemd

systemctl 的可解析輸出(例如列出所有單元)

  • January 11, 2022

我對 systemctl 的輸出不滿意

我有一個解析輸出的腳本

systemctl list-units -t service --full --all

輸出的開頭如下所示:

 UNIT                                   LOAD      ACTIVE     SUB          JOB   DESCRIPTION                                                                  
 after-local.service                    loaded    inactive   dead               /etc/init.d/after.local Compatibility                                        
● amavis.service                         not-found inactive   dead               amavis.service                                                               
 apparmor.service                       loaded    active     exited             Load AppArmor profiles                                                       
 auditd.service                         loaded    active     running            Security Auditing Service                                   

在不同的 systemd 上,帶有點的列(在 amavis.service 之前)不存在。

systemctl 是否有機器/腳本可讀的輸出?

我將它用於機器可解析的輸出,--plain --no-legend例如添加:

systemctl list-units -t service --full --all --plain --no-legend

您可以通過設置標誌來獲得 json (或json-pretty)輸出:--output

systemctl list-units \
 --type service \
 --full \
 --all \
 --output json \
 --no-pager

如果您的 systemctl 版本不支持 json 輸出,您可以像這樣獲得 json:

systemctl list-units \
 --type service \
 --full \
 --all \
 --plain \
 --no-legend \
 --no-pager \
 | sed 's/ \{1,\}/,/g' \
 | jq \
   --raw-input \
   --slurp \
   'split("\n") | map(split(",")) | .[0:-1] | map( { "unit": .[0], "load": .[1], "active": .[2], "sub": .[3] } )'

引用自:https://serverfault.com/questions/942128