bash変数に保存するシステムサービスのメモリ使用量を取得します。

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」の値を取得するには?

もちろん、テキストを解析できますが、bashの解析を簡単にするためにその値を取得できるsystemdコマンドがあるかどうか疑問に思います。

次のコマンドが見つかりました。

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

aはおそらくこれを確認するための最良のコマンドです。私は誰かがより良いものを持っていることを確認したかった。デーモンとスレッドが使用するメモリを知る必要があるので、systemdを使用したいと思います。

答え1

dbus準拠のシステムソリューションが必要な場合は、次のことができます。

$ 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ために使用できます。-jjsonjq

$ 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同じインターフェイス(ここにリストされているものと同じサービス、オブジェクト、インターフェイス、およびプロパティ)を使用して対話します。

関連情報