获取 systemd 服务内存使用情况以存储在 bash 变量中

获取 systemd 服务内存使用情况以存储在 bash 变量中

我在 systemd 守护进程中启用了一些会计功能:

DefaultCPUAccounting=yes
DefaultIOAccounting=yes
DefaultMemoryAccounting=yes
DefaultTasksAccounting=yes

例如,现在我可以看到服务内存使用情况:

● supervisor.service - Supervisor process control system for UNIX
     Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-02-21 15:10:05 UTC; 17min ago
       Docs: http://supervisord.org
   Main PID: 1842113 (supervisord)
      Tasks: 886 (limit: 108515)
     Memory: 31.9G

如何获得“31.9G”值?

当然,我可以解析文本,但我想知道是否有任何 systemd 命令可以获取该值来简化 bash 解析。

我发现这个命令:

root@panel:~# systemctl show supervisor | egrep -i memorycurrent
MemoryCurrent=34285473792

a 可能是检查这一点的最佳命令。我只是想看看是否有人有更好的东西。我想使用 systemd 因为我需要了解守护进程和线程使用的内存。

答案1

如果您想要一个与 dbus 兼容的 systemd 解决方案,您可以:

$ busctl introspect \
   org.freedesktop.systemd1 \
   /org/freedesktop/systemd1/unit/supervisor_2eservice \
   org.freedesktop.systemd1.Service

这将为您提供服务的所有服务属性的列表。当您知道什么属性有趣时,您可以简化命令并请求该特定属性:

$ busctl get-property \
   org.freedesktop.systemd1 \
   /org/freedesktop/systemd1/unit/supervisor_2eservice \
   org.freedesktop.systemd1.Service \
   MemoryCurrent

这会将以下内容返回到标准输出:

t 34285473792

前面的t类型规格。它说这是一个 UINT64。

如果您想“解析”它,您可以将其通过管道传输到awk或用于-j获取json数据并将其通过管道传输到jq

$ busctl get-property \
   org.freedesktop.systemd1 \
   /org/freedesktop/systemd1/unit/supervisor_2eservice \
   org.freedesktop.systemd1.Service \
   MemoryCurrent | awk '{print $2}'
34285473792

$ busctl get-property \
   org.freedesktop.systemd1 \
   /org/freedesktop/systemd1/unit/supervisor_2eservice \
   org.freedesktop.systemd1.Service \
   MemoryCurrent -j | jq '.data'
34285473792

org.freedesktop.systemd.Unit如果您正在寻找活动状态或依赖项之类的信息,该界面可能更合适,但我认为您在这里描述的具体信息只能在org.freedesktop.systemd.Service界面上找到。

dbus接口是一个很好的低级接口systemd。如果您想用 C 编写一些东西,您将systemd使用相同的接口(此处列出的相同服务、对象、接口和属性)进行交互

相关内容