SystemdのExecStartディレクティブと解決された環境変数の表示

SystemdのExecStartディレクティブと解決された環境変数の表示

ExecStart特定のシステムサービスで使用されているガイドライン全体を抽出する方法があるかどうか疑問に思います。 「すべて」は、次の操作ExecStartで表示されるリテラルバージョンではなく、文字列の解釈されたバージョンを表します。

systemctl show kubelet.service -p ExecStart

例:

$ cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

[Service]
...
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/opt/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

一般的なsystemctl show <svc>ガイドラインは「リテラル」文字列を表示します。

$ systemctl show kubelet.service -p ExecStart --no-pager | cut -d";" -f2 | sed 's@argv\[\]=@@' | sed 's@^ @@'
/opt/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

しかし、環境変数の内容が正しく表示されるように、上記の解釈されたバージョンを探しています。

EnvironmentFile私はこの状態が(上記のセクションで宣言されているように)これらの変数が存在する環境ファイルの存在をすでに認識している必要があると信じているので、systemdエンジンのどこかでこの状態を使用できることを願っています。

もちろん、サービスファイルを解析してこれらすべての情報を取得するスクリプトを書くことはできますが、より簡単な方法があると予想/希望しています。

答え1

/procプロセスの環境を表示するために照会できます。

# MainPID=$(systemctl show -p MainPID docker.service | cut -d '=' -f 2)
# cat "/proc/$MainPID/environ" | tr '\0' '\n'
LANG=C.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NOTIFY_SOCKET=/run/systemd/notify
LISTEN_PID=1230
LISTEN_FDS=1
LISTEN_FDNAMES=docker.socket
INVOCATION_ID=4f91e56391f742b2aefa4252b6760f42
JOURNAL_STREAM=9:36808

関連情報